【发布时间】:2014-06-07 18:59:09
【问题描述】:
抑制未使用变量的 C 编译器警告的一种众所周知且可移植的方法是(请参阅unused parameter warnings in C code):
#define UNUSED(x) (void)(x)
我正在寻找一种方法来概括它以获取多个输入(不同类型):
void foo(int a, long b, void* c){
/* Want this: */
ALL_UNUSED(a, b, c);
/* instead of: */
UNUSED(a);
UNUSED(b);
UNUSED(c);
}
似乎可以解决问题的一种方法是使用可变参数函数
static inline void ALL_UNUSED(int dummy, ...) {}
但是,我怀疑这种解决方案在专家眼中是令人反感的。
是否有一种符合标准且可移植(即不使用__attribute__((unused)))的方式来制作可变参数 UNUSED() 函数/宏?非常感谢!
编辑
在 C99 或 C 预处理器的上下文中,似乎不存在一种干净的方式来执行我所要求的操作。这就是生活。
在下面的回答中,@Dabo 展示了一种非常有趣的方式来执行我要求使用一系列宏的操作。这是整洁且内容丰富的(至少对我而言),所以我接受这个答案。也就是说,我不会将它部署在一个大项目中,因为它的眼泪足以超过它带来的好处(在我看来)。但人们在这里会得出不同的结论。
如下所述,使用空可变参数函数的方法也不是完美的。虽然它是一个非常优雅的单行代码,但它会引发有关未初始化变量的警告(如果是的话)。此外,你必须相信你的编译器会完全优化它,我原则上反对这一点,但我尝试过的所有编译器实际上都是这样做的。
一个相关案例是在早期的高级接口设计阶段之后对函数进行存根。然后您未使用的变量将全部是函数参数并按定义进行初始化,以下方法可以正常工作
static inline void UNUSED(int dummy, ...) {}
void foo(int a, long b, void* c){
UNUSED(a, b, b); /* No warnings */
}
【问题讨论】:
-
用
#define UNUSED(...) (void)(__VA_ARGS__)怎么样。 -
很遗憾没有——试过了。编译器将警告未使用的表达式结果或“作为语句的值”。语义上,你期望什么 (void) (a, b, c);是什么意思?
-
感谢您指出这一点。尝试其他方式...
-
谁能详细说明可变参数函数的问题?
-
注意 gcc 有
-Wno-unused-variable选项,这似乎符合您的要求?虽然也许问题更多的是关于 varadics 和宏...
标签: c macros c-preprocessor