c++ cpp中的宏展开和拼接

xvw2m8pv  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(166)
#include <string>

using namespace std;

#define PRINT_INFO() printf("%s",__FUNCTION__)
#define PRINT(str,...) printf("%s %s", PRINT_INFO(), str, ##__VA_ARGS__)

int main() {
    PRINT_INFO(); // expected output = main
    PRINT("Hello %s", "World"); // expected output = main Hello World
    return 0;
}

考虑上面的c++代码片段。我的意图是在PRINT()宏中使用PRINT_INFO()宏,同时打印从main发送的参数。
然而,我得到了〉〉命令被信号11终止
我怎样才能得到我想得到的东西?

wvyml7n5

wvyml7n51#

想想当PRINT宏展开时会发生什么:

printf("%s %s", PRINT_INFO(), str, ##__VA_ARGS__)
-> printf("%s %s", printf("%s",__FUNCTION__), str, ##__VA_ARGS__)

我觉得这不是你的本意。
也许你的意思是:

#define PRINT_INFO() printf("%s ",__FUNCTION__)
#define PRINT(str,...) do { PRINT_INFO(); printf(str, ##__VA_ARGS__); } while(0)

我看不出有两个宏会增加什么价值。另一个选择是:

#define PRINT(str,...) printf("%s:%d: "  str, __FUNCTION__, __LINE__, ##__VA_ARGS__)

这也提供了行信息,如果不需要,可以删除它。

相关问题