5

我在 make 文件中使用以下代码从 CPP 文件访问变量 VENDOR_NAME。

EXTRA_DEFINE += -DVENDOR_NAME=$(VENDOR_NAME) VENDOR_NAME包含一个字符串。

在我的 cpp 文件中,当我尝试使用此变量时,出现如下错误。

cout << VENDOR_NAME;

Feature1.cpp.bak.cpp:8:'Default_Vendor' 未声明(首先使用此函数) Feature1.cpp.bak.cpp:8:(每个未声明的标识符仅报告一次

我想这是因为我的字符串不包含双引号,并且编译器正在考虑 VENDOR_NAME 的内容作为变量。

如何在我的 CPP 文件中将此变量作为字符串获取,以便我可以像#define编辑它一样使用它?

谢谢...

4

2 回答 2

10

您的 makefile 将为编译器创建一个命令行。出现的问题是,如果您只是将值括在引号中:

EXTRA_DEFINE += -DVENDOR_NAME="$(VENDOR_NAME)"

...外壳会将引号视为简单地描述命令行参数,因此它可能会将它们剥离(尽管它可能取决于您使用的外壳)。为了防止这种情况,您需要使用转义引号创建参数:

EXTRA_DEFINE += -DVENDOR_NAME="\"$(VENDOR_NAME)\""

我认为大多数典型的 shell,至少对于 Windows 和 Linux,都会接受反斜杠作为转义符以保留​​引号,但我确信至少有一个你必须以不同的方式进行引用.

于 2012-12-05T07:02:20.470 回答
3

使用预处理器将其转换为字符串。

#define stringify( x ) stringify_literal( x )
#define stringify_literal( x ) # x

std::cout << stringify( VENDOR_NAME );

给定对可变参数宏的预处理器支持(官方为 C++11,实际上可用时间更长),VENDOR_NAME可能包括逗号:

#define stringify( ... ) stringify_literal( __VA_ARGS__ )
#define stringify_literal( ... ) # __VA_ARGS__

std::cout << stringify( VENDOR_NAME );
于 2012-12-05T07:02:26.567 回答