为什么以下C / C ++宏不起作用?

时间:2013-10-07 00:31:12

标签: c++ macros

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

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

2 个答案:

答案 0 :(得分:3)

因为

#define COMPANY getCompanyName();

删除分号:

#define COMPANY getCompanyName()

详细说明你的写作方式:

const wchar_t * product = PRODUCT;

扩展为:

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

L" in Canada";

本身就是一个很好的表达方式。故事的士气:要小心宏中的分号,通常它们不是必需的,但有时它们可​​能是。

答案 1 :(得分: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(甚至从;删除COMPANY)将扩展为

getCompanyName() L" in Canada."

这是语法错误。