如何在C中抑制“未使用的参数”警告?

时间:2010-08-30 09:14:22

标签: c gcc gcc-warning

例如:

Bool NullFunc(const struct timespec *when, const char *who)
{
   return TRUE;
}

在C ++中,我能够对参数进行/*...*/注释。但当然不是在C中,它给了我错误error: parameter name omitted

11 个答案:

答案 0 :(得分:263)

我通常会写一个像这样的宏:

#define UNUSED(x) (void)(x)

您可以将此宏用于所有未使用的参数。 (请注意,这适用于任何编译器。)

例如:

void f(int x) {
    UNUSED(x);
    ...
}

答案 1 :(得分:89)

在gcc中,您可以使用unused attribute标记参数。

  

此属性附加到变量,表示变量为   意味着可能未使用。海湾合作委员会不会对此发出警告   变量

实际上,这是通过在参数之前放置__attribute__ ((unused))来实现的。例如:

void foo(workerid_t workerId) { }

变为

void foo(__attribute__((unused)) workerid_t workerId) { }

答案 2 :(得分:54)

你可以使用gcc / clang的unused属性,但是我在标题中使用这些宏来避免在整个源代码中使用gcc特定属性,而且__attribute__到处都有点冗长/丑陋。

#ifdef __GNUC__
#  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
#  define UNUSED(x) UNUSED_ ## x
#endif

#ifdef __GNUC__
#  define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
#  define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif

然后你可以......

void foo(int UNUSED(bar)) { ... }

我更喜欢这个,因为如果您尝试在代码中使用bar,则会出现错误,因此您无法错误地保留该属性。

和功能......

static void UNUSED_FUNCTION(foo)(int bar) { ... }

注1):
据我所知,MSVC没有等同于__attribute__((__unused__))

注2):
UNUSED宏不适用于包含括号的参数,因此,如果您有float (*coords)[3]之类的参数,不能执行, float UNUSED((*coords)[3])float (*UNUSED(coords))[3],这是我到目前为止发现的UNUSED宏的唯一缺点,在这些情况下,我回归(void)coords;

答案 3 :(得分:16)

使用带有未使用属性的gcc:

int foo (__attribute__((unused)) int bar) {
    return 0;
}

答案 4 :(得分:8)

看到它被标记为gcc,您可以使用命令行开关Wno-unused-parameter

例如:

gcc -Wno-unused-parameter test.c

当然,这会影响整个文件(甚至可能取决于设置开关的位置而定),但是您不必更改任何代码。

答案 5 :(得分:5)

标记属性是理想的方式。 MACRO导致有时混乱。 并且通过使用void(x),我们在处理中增加了开销。

如果不使用输入参数,请使用

void foo(int __attribute__((unused))key)
{
}

如果不使用函数

中定义的变量
void foo(int key)
{
   int hash = 0;
   int bkt __attribute__((unused)) = 0;

   api_call(x, hash, bkt);
}

现在稍后使用哈希变量作为逻辑,但不需要bkt。将bkt定义为未使用,否则编译器说'bkt set bt not used“。

注意:这只是为了抑制警告而不是优化。

答案 6 :(得分:5)

禁止源代码块的未使用参数警告的gcc / g ++特定方法是使用以下pragma语句将其括起来:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop

答案 7 :(得分:3)

我遇到了同样的问题。我使用了第三方库。当我编译这个库时,编译器(gcc / clang)会抱怨未使用的变量。

喜欢这个

  

test.cpp:29:11:警告:变量'magic'设置但未使用[-Wunused-but-set-variable]        短魔法[] = {

     

test.cpp:84:17:警告:未使用的变量'before_write'[ - Wunused-variable]            int64_t before_write = Thread :: currentTimeMillis();

所以解决方案很清楚。添加-Wno-unused作为gcc / clang CFLAG将禁止所有“未使用”警告,即使您已设置-Wall也是如此。

通过这种方式,您无需更改任何代码。

答案 8 :(得分:1)

在MSVC中抑制特定警告,将编号指定为/ wd#就足够了。我的CMakeLists.txt包含这样的块:

If (MSVC)
    Set (CMAKE_EXE_LINKER_FLAGS "$ {CMAKE_EXE_LINKER_FLAGS} / NODEFAULTLIB: LIBCMT")
    Add_definitions (/W4 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127)
    Add_definitions (/D_CRT_SECURE_NO_WARNINGS)
Elseif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUC)
    Add_definitions (-Wall -W -pedantic)
Else ()
    Message ("Unknown compiler")
Endif ()

现在我不能说/ wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127究竟是什么意思,因为我三年没有关注MSVC,但它们会抑制不影响结果的超级警告。

答案 9 :(得分:0)

我见过这种风格:

if (when || who || format || data || len);

答案 10 :(得分:-1)

为了记录,我喜欢Job的上述答案,但我很好奇只是在“无所事事”声明中使用变量名称的解决方案:

void foo(int x) {
    x; /* unused */
    ...
}

当然,这有缺点;例如,没有“未使用”的注释,它看起来像是一个错误,而不是一个有意的代码行。

好处是不需要任何DEFINE,它可以消除警告。

是否有任何性能,优化或其他差异?