2012-12-05 53 views
5

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

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 ed?

谢谢...

回答

10

您的makefile将为编译器创建一个命令行。所产生的问题是,如果你只是包围引号的值:

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

...外壳会看到报价为简单地划定一个命令行参数,所以它可能会剥夺他们过(尽管它可以依赖你使用的shell)。为了防止这种情况,你要与转义引号创建参数:

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

我认为最典型的壳,至少对Windows和Linux的,将接受一个反斜杠作为转义保留引号,但我相信至少有一个,你必须做不同的引用。

+0

这是缺少宏展开的水平...棘手 – Potatoswatter

+0

@Potatoswatter:再也没有! :-) –

+0

@Jerry Coffin:谢谢。这足以拯救一天..再见宏!:) – NeonGlow

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); 
+1

如果'VENDOR_NAME'包含逗号(例如“Foo,Inc.”),则可能有问题。可能最好是在makefile文件中处理引用。 – jamesdlin

+0

@Patatoswatter:非常感谢您的回答。如果我可以在make文件中做到这一点,它会更有用。请让我知道你是否可以帮忙。 – NeonGlow

+0

@jamesdin:谢谢你指出。你能进一步帮助我如何做到这一点? – NeonGlow