【发布时间】:2019-12-15 19:43:36
【问题描述】:
我正在创建一个接受 2 个字符串的宏:变量字符串和文字字符串。如何将它们组合成一个接受单个变量的函数?
我知道我们可以在一个宏中组合两个文字字符串。
#define LOGPRINT(x,y) func(x y)
#define LOGPRINTSINGLE(x) func(x)
func(char *fmt)
{
printf(fmt);
}
下面的代码可以正常工作:
char * test = "hey ";
LOGPRINT("hello ", "world!");
LOGPRINTSINGLE(hey);
但是下面的代码失败了。
LOGPRINT(test, "world!");
如何在宏中将变量字符串 test 与文字字符串“world”结合起来? 预期结果是“嘿世界”被传递给 func()。
**编辑/注意:规则是我只允许更改这一侧的代码,而不是调用者和 func()。
【问题讨论】:
-
简短的(实际上是唯一的)答案是:你不能。预处理器是在“正确”编译之前作为单独步骤运行的。因此,预处理器对变量一无所知,甚至对变量的可能内容一无所知,因为这仅在运行时才知道,可能在编译后很长时间。
-
如果你真的使用 C++(如标签建议的那样),那么你可以这样做
#define LOGPRINT(x,y) func((std::string(x) + std::string(y)).c_str()) -
请选择一种编程语言。
-
使用“真实”函数而不是宏。它接受两个
const char *参数;你的问题都消失了。甚至是代码膨胀问题。 -
XY 问题。您不需要字符串连接。您需要一个有效的日志宏。具体来说,就像 printf 一样工作。
标签: c++ c macros gnu preprocessor