定义USE(x)(x)=(x)

Cyb*_*bex 6 c c-preprocessor

在其中一个C源代码文件中,我找到了以下行(宏):

#define USE(x) (x) = (x)
Run Code Online (Sandbox Code Playgroud)

它是这样使用的:

int method(Obj *context)
    {
    USE(context);
    return 1;
    }
Run Code Online (Sandbox Code Playgroud)

谷歌搜索后,我发现了以下描述:

//宏来摆脱一些编译器警告

你能告诉我更多关于这个宏的信息吗?

谢谢你的回答!

Sin*_*ion 13

一些编译器抱怨变量从未真正用于任何事情.例如:

int main(int argc, char **argv) {
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

得到:

Output from llvm C/C++/Fortran front-end (llvm-gcc)

/tmp/webcompile/_7618_1.c: In function 'main':
/tmp/webcompile/_7618_1.c:9: warning: unused parameter 'argc'
/tmp/webcompile/_7618_1.c:9: warning: unused parameter 'argv'
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我可以使用你的宏来摆脱这些警告:

#define USE(x) (x) = (x)


int main(int argc, char **argv) {
  USE(argc); /* get rid of warnings */
  USE(argv); /* get rid of warnings */
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 秘密酱:http://llvm.org/demo/index.cgi C/C++编译器触手可及! (3认同)

Arm*_*yan 8

当定义/声明变量但从未使用变量时,编译器会发出警告.这些包括函数参数.某些编码样式需要始终命名函数参数,但其中一些可能不会在函数中使用.它们留作将来使用.对于这些情况,您USE(param)可以避免警告

  • @the_drow:保持警告通常是个坏主意.当你习惯了它们时,你终于不会再读它们了,然后就会错过它们.尝试通过一些解决方法(例如演员表)简单地使他们沉默,而不是消除其原因,这是一个更糟糕的想法.当然,有时解决方案实际上*是*演员.USE宏的另一个常见版本是`#define USE(x)((void)(x))`. (5认同)

Pat*_*ter 5

使用gcc可以__attribute__((unused))用来抑制警告.