引用宏的扩展值

时间:2012-03-12 15:07:43

标签: c++ makefile g++ c-preprocessor stringification

这让我疯了。我在命令行上使用-D选项

定义了一个宏
-DFOO="foobarbaz"

然后我想做这样的事情

string s = "FOO" ;

获得

string s = "foobarbaz" ;

因为显然命令行的引号被删除了,即使我试图用\来逃避它们。我已经尝试了所有我能想到的字符串化和其他宏,它只是不起作用。要么我从预处理器得到错误的#符号错误,要么我最终得到

string s = foobarbaz ;

显然无法编译。

2 个答案:

答案 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?