0

这似乎很简单,但我无法弄清楚。这是一个问题:我有一个返回字符串的简单函数:

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; 

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

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

#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;
}
4

2 回答 2

3

因为

#define COMPANY getCompanyName();

删除分号:

#define COMPANY getCompanyName()

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

const wchar_t * product = PRODUCT;

扩展为:

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

L" in Canada";

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

于 2013-10-07T00:32:43.290 回答
2

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

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(即使删除;from COMPANY)将扩展到

getCompanyName() L" in Canada."

这是一个语法错误。

于 2013-10-07T00:49:01.837 回答