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()

したがって、( from をPRODUCT削除しても)展開されます;COMPANY

getCompanyName() L" in Canada."

これは構文エラーです。

于 2013-10-07T00:49:01.837 に答える