C中未命名的参数

时间:2010-08-15 11:19:04

标签: c gcc macros

在C中,与C ++不同,函数定义的所有参数都必须命名。

我没有使用(void)a撤消“未使用的参数”错误,也没有公开使用__attribute__((unused)),而是创建了以下宏:

#define UNUSED2(var, uniq) UNUSED_ ## line ## var __attribute((unused))
// squash unused variable warnings, can it be done without var?
#define UNUSED(var) UNUSED2(var, __func__)

像这样使用

void blah(char const *UNUSED(path)) {}

我是否有某种方法可以保证一个独特的“虚拟”变量名称(显然LINE__func__不能删除它),或忽略命名未使用的变量?

Update0

使用的最终代码是available here

#ifdef __cplusplus
    // C++ allows you to omit parameter names if they're unused
#   define OMIT_PARAM
#else
    // A variable name must be provided in C, so make one up and mark it unused
#   define OMIT_PARAM3(uniq) const omitted_parameter_##uniq VARATTR_UNUSED
#   define OMIT_PARAM2(uniq) OMIT_PARAM3(uniq)
#   define OMIT_PARAM OMIT_PARAM2(__COUNTER__)
#endif

#ifdef _MSC_VER
#   define VARATTR_UNUSED
#else
#   define VARATTR_UNUSED __attribute__((unused))
#endif

它的使用方式如下:

void blah(char const *OMIT_PARAM) {}

并且避免使用未使用的参数,未命名的参数警告,并保证它不会破坏其他变量名称。

2 个答案:

答案 0 :(得分:5)

停止寻找丑陋的不可移植的,特定于编译器的黑客攻击。即使函数没有使用它的一个参数,大概存在参数存在的原因:匹配特定的原型/签名,最有可能出于函数指针类型兼容性的目的。假设是这种情况,参数具有一个名称,该名称由调用者预期传递的内容决定;你的特定功能没有使用任何参数的事实在很大程度上是无关紧要的。因此,请给它正确的名称,如果您坚持启用此警告,请使用__attribute__((unused))。我总是禁用未使用的参数警告,因为它显然是假的。

答案 1 :(得分:2)

VC有一个__COUNTER__宏,它提供了唯一性,看起来GCC有一个与版本4.3.5相同名称的等效宏(尽管我目前无法找到实时链接)。