246

例如:

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

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

错误:参数名称省略

4

12 回答 12

347

我通常写一个这样的宏:

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

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

例如:

void f(int x) {
    UNUSED(x);
    ...
}
于 2010-08-30T09:16:32.503 回答
131

在 GCC 中,您可以使用unused属性标记参数。

附加到变量的此属性意味着该变量可能未被使用。GCC 不会对此变量产生警告。

在实践中,这是通过将其放在__attribute__ ((unused))参数之前来完成的。例如:

void foo(workerid_t workerId) { }

变成

void foo(__attribute__((unused)) workerid_t workerId) { }
于 2010-08-30T09:24:58.693 回答
69

您可以使用 GCC 或Clang未使用属性。但是,我在标头中使用这些宏以避免在整个源代码中都有 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;.

于 2012-10-15T07:39:59.430 回答
22

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

int foo (__attribute__((unused)) int bar) {
    return 0;
}
于 2013-12-20T13:09:57.163 回答
22

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

例如:

gcc -Wno-unused-parameter test.c

当然,这会影响整个文件(可能还有项目,具体取决于您设置开关的位置),但您不必更改任何代码。

于 2018-07-04T13:38:40.177 回答
12

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

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
于 2016-08-26T22:18:04.510 回答
6

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

像这样

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

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

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

这样,您无需更改任何代码。

于 2015-01-20T13:12:33.800 回答
6

从 C++ 17 开始,该[[maybe_unused]]属性可用于抑制有关未使用参数的警告。

基于OP的示例代码:

Bool NullFunc([[maybe_unused]] const struct timespec *when, [[maybe_unused]] const char *who)
{
   return TRUE;
}
于 2021-09-12T16:33:15.750 回答
5

标记属性是理想的方式。宏观有时会导致混乱。通过使用 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”。

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

于 2014-02-28T17:44:54.160 回答
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,但他们压制了不影响结果的超级警告。

于 2017-03-16T14:06:12.783 回答
0

我见过这种风格被使用:

if (when || who || format || data || len);
于 2010-08-30T10:51:42.387 回答
0

作为记录,我喜欢乔布的回答,但我很好奇在“无所事事”语句中仅使用变量名的解决方案:

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

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

好处是不需要 DEFINE 并且它消除了警告。

于 2013-03-25T05:39:49.083 回答