3

这让我发疯了。我在命令行上定义了一个带有-D选项的宏

-DFOO="foobarbaz"

然后我想做这样的事情

string s = "FOO" ;

要得到

string s = "foobarbaz" ;

因为显然命令行中的引号被删除了,即使我试图用\. 我已经尝试了所有我能想到的字符串化和附加宏,但它不起作用。要么我从预处理器收到关于放错#标志的错误,要么我最终得到

string s = foobarbaz ;

这显然不会编译。

4

2 回答 2

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
于 2012-03-12T15:13:18.227 回答
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?
于 2012-03-12T17:04:29.840 回答