C++ 使用字符串化运算符将字符串值而不是常量字符串文字传递给宏
我想将字符串值传递到一个名为C++ 使用字符串化运算符将字符串值而不是常量字符串文字传递给宏,c++,string,macros,string-literals,C++,String,Macros,String Literals,我想将字符串值传递到一个名为TEST\u FAIL的宏中。我尝试了以下代码 string error = "myError"; TEST_FAIL(error.c_str()); TEST_FAIL("myError"); 但这一结果是错误的 error.c_str() "myError" 如何才能在两行中输入字符串error的第一行值,即“myError” 我使用库中的宏,定义如下 #define TEST_FAIL(msg) \ {
TEST\u FAIL
的宏中。我尝试了以下代码
string error = "myError";
TEST_FAIL(error.c_str());
TEST_FAIL("myError");
但这一结果是错误的
error.c_str()
"myError"
如何才能在两行中输入字符串error
的第一行值,即“myError”
我使用库中的宏,定义如下
#define TEST_FAIL(msg) \
{ \
assertment(::Test::Source(__FILE__, __LINE__, (msg) != 0 ? #msg : "")); \
if (!continue_after_failure()) return; \
}
在宏内部,#before#msg
是一个宏扩展,用于“字符串化”表达式(即,将精确表达式转换为字符串。有关详细信息,请参阅)
如果您想获得msg
的值,只需删除#,如下所示:
#define TEST_FAIL(msg) \
{ \
assertment(::Test::Source(__FILE__, __LINE__, (msg) != 0 ? msg : "")); \
if (!continue_after_failure()) return; \
}
宏中的#运算符将输入参数转换为字符串,因此传递error.c_str()将准确打印“error.c_str()”。详情请参见此处
c预处理器在编译之前运行,当然不能替换运行时获得的任何值。我希望在不更改
TEST\u FAIL
宏的情况下执行此操作,因为这是在外部库中定义的。这可能吗?宏操作是在编译之前完成的。因此,此时编译器不知道error的实际值(即“myError”)。恐怕你不能不改变考试不及格就这样做。但是,您仍然可以使用固定的代码定义自己的宏。宏就像源代码的类固醇上的“复制粘贴”。但它仍然在源代码中,而不是在执行时。因此,附加的宏或函数将不会有帮助!可能,唯一的选择是使用当前字符串值生成类并在运行时编译它。在发布之前我已经看到了这一点,但我仍然不知道如何将字符串值传递给这个宏。