为什么在c / c ++中直接写一个字面后面跟一个分号?

时间:2017-08-08 19:24:44

标签: c++ c c-preprocessor

我正在查看一些代码,我在宏中遇到以下行:

int foo = 0; (foo);

它编译得很好。事实上,似乎

0;

是C / C ++中的有效代码行。

我已经看过调试和发布版本中生成的程序集(在msvc上),它对程序集没有任何影响。我的测试很简单(有和没有(foo);):

int main()
{
    int foo = 0;
    (foo);
    return 0;
}

我的问题是为什么有人想要这样做?我确定(foo);是宏的原因,但我不确定原因。

对于上下文,它所在的宏看起来像这样(我已经重命名了变量):

#define MY_MACRO int _foo = 0; (_foo); UINT _bar = CP_THREAD_ACP; (_bar); LPCWSTR _baz = NULL; (_baz); LPCSTR _thing = NULL; (_thing)

在代码中,它简称为

MY_MACRO;
//other code...

2 个答案:

答案 0 :(得分:0)

正如Fred Larson在评论中所建议的那样,它可以用来抑制编译器警告。我试过这段代码:

int foo = 0;
foo;

我调试了代码并且编译器完全跳过了第二行,所以它似乎没有任何重要性。当然,如果您担心这些行会影响您的宏,您可以像我一样使用调试器逐步完成代码。

答案 1 :(得分:0)

这可能是宏观扩张的结果。

可能只是某个人很傻。

可能是抑制编译器警告。

在任何情况下,这样的陈述在语言中都是完全合法的,并且对程序没有实际影响。 任何有能力的编译器都会在编译期间删除它们。