c++ 如何定义一个宏,它可以解析为方法名或无操作?

cetgtptt  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(91)

在代码库中,我有许多部分根据启用的功能打开或关闭,目的是生成尽可能小的程序代码(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编译器进行编译。

vm0i2vca

vm0i2vca1#

只写:

void SetFeatureOptions(int optionA, int optionB)
    {
#ifdef FEATURE
        m_optA = optionA;
        m_optB = optionB;
#endif
    }

并确保你的编译器打开了优化。如果函数在头文件中定义并且为空,你的编译器足够聪明,可以删除函数调用。
如果函数是在另一个.cpp文件中定义的,编译器将不知道它是空的,因此它不会删除调用。

相关问题