【问题标题】:Converting to function to noop将函数转换为 noop
【发布时间】:2020-10-31 17:29:56
【问题描述】:

所以我有这个代码:

#ifdef FEATURE 
void foo(void);
#endif //#ifdef FEATURE
main {
    #ifdef FEATURE
    foo();
    #endif //FEATURE
}

我只是想知道写这个是否更优雅。我正在考虑做这样的事情

#ifdef FEATURE 
void foo(void);
#else 
static inline foo() {
}
#endif //#ifdef FEATURE

这样编译器应该只删除那部分代码并保持主代码更干净。 只是想知道是否有更好的解决方案?

【问题讨论】:

  • static inline foo() -> static inline void foo(void)

标签: c c-preprocessor


【解决方案1】:

你可以这样做:

#ifdef FEATURE 
void foo (void) {  }
#else
#define foo()
#endif //#ifdef FEATURE

int main () {
    foo();
    return 0;
}

【讨论】:

  • 为什么声明后有{}
  • @Barmar 是定义。刚刚创建了要测试的函数。
  • 我认为这应该只是在另一个翻译单元中定义的函数的声明。
  • @Barmar 是的,我在那里创建只是作为示例,但如果它是一个声明,它的工作方式相同。并且可以是cmets中提到的静态内联。这种方法避免了main中的#ifdefs。
  • #define foo() 可能有问题,例如。带有逗号运算符int a = (foo(), 1);。在里面放一些东西,通常是 #define foo() ((void)0)do{}while(0)
【解决方案2】:

如果有更好的解决方案吗?

没有。而且解决方案非常好,不需要更好的解决方案。

有些人喜欢删除inline 说明符,因为它只是对编译器的提示,而只是static void foo(void) {}。 (但inline 说明符使-Wunused-functiongcc 发出警告,所以我会说使用它)。

【讨论】:

  • 只是好奇是否有办法将其包装在宏函数中。
猜你喜欢
  • 2023-03-11
  • 2016-01-24
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 2016-06-02
相关资源
最近更新 更多