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 ++宏连接的主要内容,如果未能解决你的问题,请参考以下文章