C++ 为什么下列C/C++;宏不工作?

C++ 为什么下列C/C++;宏不工作?,c++,macros,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;

看起来很简单,但我搞不懂。问题是: 我有一个返回字符串的简单函数:

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;
}
#包括
#包括
const wchar_t*getCompanyName(){返回L“测试公司”;};
#定义公司getCompanyName();
#定义产品公司L“在加拿大”
int _tmain(int argc,_TCHAR*argv[]{
const wchar\u t*company=company;//获取测试公司
const wchar_t*place=PRODUCT;//在加拿大获得测试公司
wprintf(公司);
wprintf(地点);
返回0;
}
因为

#define COMPANY getCompanyName();
删除分号:

#define COMPANY getCompanyName()
更详细地说,你写的方式是:

const wchar_t * product = PRODUCT;
扩展为:

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

这是一个很好的表达,它本身什么都不做。故事的寓意:在宏中使用分号时要小心,通常分号是不必要的,但有时可能是必要的。

因为

#define COMPANY getCompanyName();
删除分号:

#define COMPANY getCompanyName()
更详细地说,你写的方式是:

const wchar_t * product = PRODUCT;
扩展为:

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


这是一个很好的表达,它本身什么都不做。故事的寓意:在宏中使用分号时要小心,通常分号是不必要的,但有时可能是必要的。

字符串串联只在相邻的文字字符串之间起作用。您可以这样做:

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()
的同义词

因此
产品
(甚至从
公司
中删除
)将扩展到

getCompanyName() L" in Canada."

这是一个语法错误。

字符串串联仅在相邻文字字符串之间起作用。您可以这样做:

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()
的同义词

因此
产品
(甚至从
公司
中删除
)将扩展到

getCompanyName() L" in Canada."

这是一个语法错误。

在将产品扩展到加拿大的
getCompanyName()L中。(
prog.cpp:5:25:error:string常量“”之前应为“,”或“;”),因此您试图使用字符串文字来表示函数的结果。是的,这是一个语法错误。如果你想在C中连接两个字符串,你必须使用C++中的<代码> StrnCAT//C>或类似的函数,或者字符串对象。尝试
#定义公司L“测试公司”
,然后它就会工作。#定义公司L“测试公司”-是的,它会工作。但我需要公司成为一个函数,因为它需要返回一个系统运行时值。(prog.cpp:5:25:error:string常量“”之前应为“,”或“;”),因此您试图使用字符串文字来表示函数的结果。是的,这是一个语法错误。如果你想在C中连接两个字符串,你必须使用C++中的<代码> StrnCAT//C>或类似的函数,或者字符串对象。尝试
#定义公司L“测试公司”
,然后它就会工作。#定义公司L“测试公司”-是的,它会工作。但是我需要公司成为一个函数,因为它需要返回一个系统运行时值。如何使宏工作-连接函数返回的字符串值?@user2852910:你不能使用宏。您需要实际编写一个函数。如果你实际使用C++而不是C,那么使用<代码> STD::WScstring ,并且可以用<代码> +< /COD>操作符连接两个字符串。这比C.getCompanyName()L“在加拿大”更简单。是一个语法错误,如何修复它并使其工作?“;”将编译,但不会像我们已经做的那样工作know@user2852910如果您使用C++和GETFrutyMeMe()返回一个STD::WStand,则可以定义<代码>产品<代码> > <代码>公司+L“在加拿大”< /C>。但我认为这也需要对您的程序进行大量修改。无论如何,你现在问的问题与原来的问题大不相同,在仔细考虑了其他问题后,你可能想试着问一个新问题。谢谢你的评论,这很有意义。如何使宏工作-连接函数返回的字符串值?@user2852910:你不能使用宏。您需要实际编写一个函数。如果你实际使用C++而不是C,那么使用<代码> STD::WScstring ,并且可以用<代码> +< /COD>操作符连接两个字符串。这比C.getCompanyName()L“在加拿大”更简单。是一个语法错误,如何修复它并使其工作?“;”将编译,但不会像我们已经做的那样工作know@user2852910如果您使用C++和GETFrutyMeMe()返回一个STD::WStand,则可以定义<代码>产品<代码> > <代码>公司+L“在加拿大”< /C>。但我认为这也需要对您的程序进行大量修改。无论如何,你现在问的问题与原来的问题大不相同,在仔细考虑了其他问题后,你可能想试着问一个新问题。