【问题标题】:Unnamed parameters in CC中的未命名参数
【发布时间】:2010-08-15 11:19:04
【问题描述】:

在 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__ 不能删除它),或者根本忽略命名未使用的变量?

更新0

最终使用的代码是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) {}

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

【问题讨论】:

  • 链接断开 [2013-08-26]。 :|
  • @unwind:我想我现在修好了。

标签: c gcc macros


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-20
    • 2022-01-04
    • 2021-12-13
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2010-09-29
    • 2017-04-18
    相关资源
    最近更新 更多