g ++宏连接与c ++宏连接

Posted

技术标签:

【中文标题】g ++宏连接与c ++宏连接【英文标题】:g++ macro concatenation vs c++ macro concatenation 【发布时间】:2020-01-22 15:53:00 【问题描述】:

我正在将基于 Windows 的 c++ 项目移植到 Windows 中,但遇到了以下错误。

UeiDaqAnsiC.cpp:105:24
error: expected ')' before string constant
UEI_ERROR(__FUNCTION__ " error: %s\n", e.getErrorMessage());

看起来 linux 似乎无法将 __FUNCTION__ 宏与以下字符串连接起来。这令人困惑,因为该项目在 Windows 中编译和构建都很好。

作为一种快速修复,似乎只需在 __FUNCTION__"error: %s\n", e.getErrorMessage() 之间添加一个 , 即可完全修复它。

新的固定线路长这样UEI_ERROR(__FUNCTION__, " error: %s\n", e.getErrorMessage());

我来到这里是因为我不精通 linux g++ 编译器,我想知道这是否是解决此错误的有效解决方法,然后再修复发生此错误的所有 130 行。

编辑:我还想问一下逗号是否保留了简单连接宏和字符串的功能

EDIT2:UEI_ERROR 定义为 #define UEI_ERROR(...) UeiPalTraceOutputWithLevel(UeiPalTraceError, __VA_ARGS__)

【问题讨论】:

@Scheff 抱歉,在编辑中添加了定义。 相关/欺骗:***.com/questions/48124994/… 考虑到@NathanOliver 的链接,您可以将__FUNCTION__ 作为另一个参数传递。对于格式字符串:UEI_ERROR("%s error: %s\n", __FUNCTION__, e.getErrorMessage()); @NathanOliver 我不相信这是一个骗局,因为我首先问为什么错误会在 linux 而不是 Windows 上引发,我还问我上面所说的修复是否会改变该行的功能代码,或者只是修复错误 【参考方案1】:

__FUNCTION__ 不是字符串文字,不能通过预处理器与其他字符串文字连接。

您通过添加, 来“修复”会改变含义,主要是

printf(__FUNCTION__ " format %i", 42);        // MyFunction format 42
printf("MyFunction", "unused format %i", 42); // MyFunction

真正的解决办法是更改格式和重新排序参数:

UEI_ERROR("%s error: %s\n", __FUNCTION__, e.getErrorMessage());// MyFunction error: error message.

【讨论】:

以上是关于g ++宏连接与c ++宏连接的主要内容,如果未能解决你的问题,请参考以下文章

包含由 C/C++ 宏连接生成的字符串 [重复]

可变宏中令牌的连接

C语言的宏定义,字符串连接

C/C++ 宏字符串连接

c_cpp 使用宏来连接堆对象

C 预处理器宏参数在末尾带有空格以进行连接?