【问题标题】:Why does the following C/C++ macro not work?为什么以下 C/C++ 宏不起作用?
【发布时间】:2013-10-07 00:31:11
【问题描述】:

这似乎很简单,但我想不通。这是问题: 我有一个返回字符串的简单函数:

const wchar_t* getCompanyName() { return L"Test Company";};

我想定义如下宏:

#define COMPANY getCompanyName();
#define PRODUCT COMPANY L" in Canada"

const wchar_t * company = COMPANY; 
const wchar_t * product = PRODUCT; 

我希望看到“产品”值是“加拿大的测试公司”,但它只显示 “Test Company”和字符串“in Canada”从不连接到产品字符串

非常感谢您抽出宝贵时间,这是完整的代码:

#include <stdio.h>
#include <tchar.h>

const wchar_t* getCompanyName() { return L"Test Company";};
#define COMPANY getCompanyName();
#define PRODUCT COMPANY L" in Canada"

int _tmain(int argc, _TCHAR* argv[]) {
    const wchar_t * company = COMPANY; // get Test Company
    const wchar_t * place = PRODUCT; // get Test Company in Canada

    wprintf(company);
    wprintf(place);

    return 0;
}

【问题讨论】:

    标签: c++ macros


    【解决方案1】:

    因为

    #define COMPANY getCompanyName();
    

    去掉分号:

    #define COMPANY getCompanyName()
    

    详细地说,你写它的方式:

    const wchar_t * product = PRODUCT;
    

    扩展为:

    const wchar_t * product = getCompanyName(); L" in Canada";
    

    L" in Canada";
    

    本身就是一个很好的表达式,它什么都不做。故事的精神:注意宏中的分号,通常它们不是必需的,但有时可能是。

    【讨论】:

    • 在将 PRODUCT 扩展为 getCompanyName() L" in Canada". (prog.cpp:5:25: error: expected ‘,’ or ‘;’ before string constant`) ideone.com/PcP1ph
    • 所以你试图将函数的结果与字符串文字连接起来。
    • 是的,这是一个语法错误。如果要在 C 中连接两个字符串,则必须使用 strncat,或类似的函数,或 C++ 中的字符串对象。
    • 您只能按照您尝试的方式连接两个静态字符串。试试#define COMPANY L"Test company" 然后就可以了。
    • #define COMPANY L"Test company" - 是的,它有效。但我需要 COMPANY 是一个函数,因为它需要返回一个系统运行时值。
    【解决方案2】:

    字符串连接仅适用于相邻的 literal 字符串。你可以这样做:

    const w_char* product = L"This is " "a concatenated string " "constant.";
    

    但不是这个:

    const char* first = "First";
    const char* second = first " Second";
    

    因此,您绝对不能将文字字符串连接到调用函数的结果。并且:

    #define COMPANY getCompanyName()
    

    不调用getCompanyName 并将其值插入宏。它只是使COMPANY 成为getCompanyName() 的同义词。

    所以PRODUCT(即使从COMPANY 中删除;)将扩展为

    getCompanyName() L" in Canada."
    

    这是一个语法错误。

    【讨论】:

    • 感谢 cmets,有道理。如何使宏工作 - 连接函数返回的字符串值?
    • @user2852910:你不能用宏来做。您需要实际编写一个函数。如果您实际上使用的是 C++ 而不是 C,则使用 std::wstring,您可以使用 + 运算符连接两个字符串。这比 C 容易得多。
    • getCompanyName() L" 在加拿大。"是语法错误,如何修复它并使其工作?这 ';'将编译,但不能像我们已知的那样工作
    • @user2852910:如果您使用 C++ 并且 getCompanyName() 返回 std::wstring,那么您可以将 PRODUCT 定义为 COMPANY + L" in Canada"。但我认为这也需要对您的程序进行大量修改。无论如何,您现在提出的问题与原来的问题有很大不同,您可能想在考虑一下替代方案后尝试提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2017-10-15
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多