【问题标题】:Using a make file string variable in CPP file在 CPP 文件中使用生成文件字符串变量
【发布时间】:2012-12-05 06:59:16
【问题描述】:

我在 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 文件中将此变量作为字符串获取,以便我可以像 #defineed 一样使用它?

谢谢...

【问题讨论】:

    标签: c++ makefile


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • @Potatoswatter:不再是了! :-)
    • @Jerry Coffin:谢谢。这足以节省一天。再见宏:)
    • @NeonGlow:注意第二次编辑:如果你的宏包含空格,你真的需要在外面加上引号,包含转义的引号,所以 shell 将它作为一个包含引号的参数传递。跨度>
    • @Jerry Coffin:哦!感谢更新。我只是用那些额外的引号重新编译。
    【解决方案2】:

    使用预处理器把它变成一个字符串。

    #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 );
    

    【讨论】:

    • 如果VENDOR_NAME 包含逗号(例如“Foo, Inc.”)可能会出现问题。可能最好处理在 makefile 本身中的引用。
    • @Potatoswatter:非常感谢您的回答。如果我可以在 make 文件本身中执行此操作,它将更加有用。如果您能提供帮助,请告诉我。
    • @jamesdin:感谢您的指出。你能进一步帮助我如何做到这一点吗?
    猜你喜欢
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2023-03-25
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多