在代码库中,我有许多部分根据启用的功能打开或关闭,目的是生成尽可能小的程序代码(Arduino具有32 kB程序内存)。
让我们假设我有如下代码:
class A
{
private:
#ifdef FEATURE
int m_optA;
int m_optB;
#endif
public:
#ifdef FEATURE
void SetFeatureOptions(int optionA, int optionB)
{
m_optA = optionA;
m_optB = optionB;
}
#endif
};
#ifdef FEATURE
#define SETFEATUREOPTIONS(a, b) SetFeatureOptions(a, b)
#else
#define SETFEATUREOPTIONS(a, b) Noop() // ????? <-- what should I put here to perform NOOP
#endif
class B
{
public:
A m_a;
void DoStuff()
{
// approach 1:
#ifdef FEATURE
m_a.SetFeatureOptions(1, 34);
#endif
// approach 2:
// Lets have a macro - see above
// This way each time I want to call SetFeatureOptions but only when FEATURE is defined
// I need no ifdef/endif scope to be used explicitely.
m_a.SETFEATUREOPTIONS(1, 34);
}
}
有没有办法解析SETFEATUREOPTIONS宏,使它在作为方法名调用时编译但不生成任何代码?
为什么方法是在类A中实现Noop()方法,但我想知道是否有更好的方法,即不需要像上面提到的Noop()添加一个null方法。我不确定添加inline Noop(){}是否会向程序内存添加一些字节(发布,优化代码)。
重要提示:必须使用C++98编译器进行编译。
1条答案
按热度按时间vm0i2vca1#
只写:
并确保你的编译器打开了优化。如果函数在头文件中定义并且为空,你的编译器足够聪明,可以删除函数调用。
如果函数是在另一个.cpp文件中定义的,编译器将不知道它是空的,因此它不会删除调用。