关于C宏的错误预处理令牌无效
error about C macro invalid preprocessing token
// define the macro
#define FATAL(S,...) qDebug("%s,%s,%d,%s:"##S,"[scribble]",__FILE__,__LINE__,__FUNCTION__,##__VA_ARGS__)
// call the macro
FATAL("not supported commandid:%d",cmdid);
虽然这段代码在Windows下工作(Qt与msvc2010),但当我试图在macOS下编译它时(Qt with clang),我得到了错误::
粘贴格式为"%s,%s,%d,%s:"的命令ID不受支持:%d,无效预处理令牌。
如何使其在macOS下工作,或者是否有其他方法可以实现相同的功能?
标记##只有在逗号和变量参数之间时才具有指示可选参数的特殊含义:, ##__VA_ARGS__
这是对C语言的扩展。
在您的示例中,这对于第二个参数是正确的,但对于第一个参数则不正确。
如果您不需要第一个参数是可选的,只需删除令牌##:
#define FATAL(S,...) printf("%s,%s,%d,%s:"S,
"[scribble]",__FILE__,__LINE__,__FUNCTION__,##__VA_ARGS__)
但是第一个参数也可以是可选的,使用另一个宏来扩展字符串文字和第一个参数,同时使第一个参数是可选的:
#include <stdlib.h>
#include <stdio.h>
#define MERGE_EXPAND( a , ... ) a __VA_ARGS__
#define MERGE( a , ... ) MERGE_EXPAND( a , ##__VA_ARGS__ )
#define FATAL(S,...) printf( MERGE( "%s,%s,%d,%s:",S),
"[scribble]",__FILE__,__LINE__,__FUNCTION__,##__VA_ARGS__)
int main( void )
{
int cmdid = 12345;
FATAL();
puts( "" ) ;
FATAL( "first argument" );
puts( "" ) ;
FATAL( "first and second arguments: %d" , cmdid );
return EXIT_SUCCESS ;
}
相关文章:
- 如何在C++中使用X509证书模在令牌中查找私钥
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++:"("令牌"之前有预期的非限定 id 指向类中成员函数的指针
- Arduino 用于语句错误。令牌之前的预期')' ';'。如何解决这个问题?
- 宏定义中的预处理器令牌两边有两个双引号
- 是否可以在多行字符串文本中使用 C/C++ 预处理器令牌
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 如何将字符串作为预处理器令牌传递
- 插入protobuf时SQLite无法识别的令牌错误:要处理哪些令牌以及如何处理?
- 关于C宏的错误预处理令牌无效
- 粘贴形成了无效的处理令牌"."
- C++预处理器能否判断令牌是否为字符串
- 错误:粘贴"Java_com_my_packagename_myClass_myMethod"和"("未提供有效的预处理令牌
- 用于命名空间限定的c++预处理器令牌粘贴
- 为什么qi::skip处理来自词法分析器的令牌时会失败?
- 如何根据预定义的宏(C++预处理器)组成有效的令牌
- Bison/Flex以相反的顺序处理令牌
- 正在确定预处理器令牌的值
- 令牌化时强制预处理器评估