C++ #定义和预期的主表达式错误

C++ #定义和预期的主表达式错误,c++,c-preprocessor,C++,C Preprocessor,在Linux上尝试编译时,以下代码导致“预期的主表达式在“')‘标记’之前”错误: #define PRINTF(args, ...) printf((args), __VA_ARGS__) void test( ) { PRINTF( "test" ); } 同样的代码在Windows上运行良好。我不确定是什么问题 解决方案: 在之前添加####(在之前添加#VA#ARGS)解决了标准C中的问题,定义PRINTF(ARGS,…)意味着对PRINTF宏的任何调用都必须提供至少两个参数

在Linux上尝试编译时,以下代码导致“预期的主表达式在“')‘标记’之前”错误:

#define PRINTF(args, ...) printf((args), __VA_ARGS__)

void test( )
{
   PRINTF( "test" );
}
同样的代码在Windows上运行良好。我不确定是什么问题

解决方案:

之前添加####(在
之前添加#VA#ARGS)
解决了标准C中的问题

定义PRINTF(ARGS,…)
意味着对
PRINTF
宏的任何调用都必须提供至少两个参数

GNU预处理器提供两个扩展:

  • 在这种情况下,可以提供一个参数,它的行为就像提供了第二个空参数一样
  • ,##uu VA_ARGS_u
    在扩展中是允许的,含义如下:
    • 如果发生上一个项目符号的空参数扩展,则所有扩展都将扩展为零(即没有尾随逗号)
    • 否则,它的行为方式为
      ,\uu VA\u ARGS\uu

如果您看到编译器接受您的原始代码,这意味着使用的预处理器提供了非标准扩展。相反,您的“解决方案”可能在某些实现上不起作用。

PRINTF(“测试”)扩展为
printf((“测试”),它有一个伪逗号。闻起来像MSVC扩展,如果可以的话。什么是MSVC扩展?
\uu VA\u ARGS\uu
的使用?不,编译器接受扩展导致的损坏语法。1。您应该说明在这两种语言中使用的编译器cases@Quentin实际上,尝试的宏调用违反了约束(C116.10.3/4),很明显,GCC的扩展与MSVC的扩展一样不标准。在任何一种情况下,选择该扩展都意味着它至少不能在另一个主要编译器上工作。(我不认为你是在试图提出其他建议,但我认为可以说得更清楚。)@hvd我对MSVC的预处理器扩展或缺少它们一无所知。另外,不知道OP是否在任何时候使用了MSVC。我确实知道这个特定的扩展是MSVC的扩展之一,但不管怎样,你可以假装我写了“OP使用的编译器”,这并不影响我的评论。@hvd其他哪个主要编译器没有这个扩展?