这让我疯了。我在命令行上使用-D
选项
-DFOO="foobarbaz"
然后我想做这样的事情
string s = "FOO" ;
获得
string s = "foobarbaz" ;
因为显然命令行的引号被删除了,即使我试图用\
来逃避它们。我已经尝试了所有我能想到的字符串化和其他宏,它只是不起作用。要么我从预处理器得到错误的#
符号错误,要么我最终得到
string s = foobarbaz ;
显然无法编译。
答案 0 :(得分:3)
在命令行中使用它:
-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
答案 1 :(得分:0)
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?