这让我发疯了。我在命令行上定义了一个带有-D
选项的宏
-DFOO="foobarbaz"
然后我想做这样的事情
string s = "FOO" ;
要得到
string s = "foobarbaz" ;
因为显然命令行中的引号被删除了,即使我试图用\
. 我已经尝试了所有我能想到的字符串化和附加宏,但它不起作用。要么我从预处理器收到关于放错#
标志的错误,要么我最终得到
string s = foobarbaz ;
这显然不会编译。
这让我发疯了。我在命令行上定义了一个带有-D
选项的宏
-DFOO="foobarbaz"
然后我想做这样的事情
string s = "FOO" ;
要得到
string s = "foobarbaz" ;
因为显然命令行中的引号被删除了,即使我试图用\
. 我已经尝试了所有我能想到的字符串化和附加宏,但它不起作用。要么我从预处理器收到关于放错#
标志的错误,要么我最终得到
string s = foobarbaz ;
这显然不会编译。
在命令行上使用它:
-DFOO="\"hello world\""
例如 test.cpp 是:
#include <cstdio>
#include <string>
#include <iostream>
std::string test = FOO;
int main()
{
std::cout << test << std::endl;
return 0;
}
编译和运行给出:
$ g++ -DFOO="\"hello world\"" test.cpp
$ ./a.out
hello world
编辑这是您从 Makefile 执行此操作的方式:
DEFS=-DFOO="\"hello world\""
test: test.cpp
$(CXX) $(DEFS) -o test test.cpp
C 和 C++ 预处理器针对 C 和 C++ 进行了调整,它们不是原始的、逐字节的预处理器。它们识别字符串(如"foo"
)并且不会在其中匹配和扩展。如果要扩展宏,必须在字符串之外进行。例如,
#define foo "bar"
#include <string>
int main () {
std::string s = "Hello " foo "! How's it going?";
}
上面的字符串将扩展为
Hello bar! How's it going?