2

私は昨日同様の質問を投稿しましたが、サイトはより良い説明で新しい質問を投稿することを提案しました.

次の 2 つのマクロがあります。

#define COMPANY L"Test Company"
#define PRODUCT COMPANY L" in Canada"

PRODUCT の結果は「Test Company in Canada」になります。

現在、次の要件があります。

  1. COMPANY を「動的な」文字列にして、関数を呼び出して会社名を返します。#define COMPANY getCompanyName()
  2. #define PRODUCT COMPANY L" in Canada" など、他のコードを COMPANY を参照するように変更することは許可されていません。これは、コードに非常に多くのマクロが含まれているためです。

変更に関する問題: 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 * product = PRODUCT; // get Test Company in Canada

wprintf(company);
wprintf(product);


return 0;
} 
4

2 に答える 2

2

これは厄介なハックですが、実際には可能です。COMPANYリテラルで始まり、リテラルで終わり、暗黙的に に変換できる式に定義しconst wchar_t *ます。

#define COMPANY L"" + getCompanyName() + L""

もちろん、は を返してはgetCompanyName() なりませんconst wchar_t *。なぜなら、operator+は 2 つのポインターに対して定義されておらず、とにかく文字列ではなくアドレスに対して機能するからです。

基本的には asstd::wstringが必要ですが、おそらく変換可能である必要がありますが、そうconst wchar_t *std::wstringはありません。したがって、独自のクラスを定義する必要があります。

struct AutoConvertibleString {
    std::string s;
    AutoConvertibleString(const std::string &s) : s(s) {}
    // C++ optimization for move:
    // AutoConvertibleString(std::string s) : s(std::move(s)) {}
    operator const wchar_t *() { return s.c_str(); }
};
AutoConvertibleString operator+(const wchar_t *l, const AutoConvertibleString &r) {
    return (l + r.s).c_str();
}
AutoConvertibleString operator+(const AutoConvertibleString &l, const wchar_t *r) {
    return (l.s + r).c_str();
}
// Ok, the operator+s could be optimized to use move for temporaries too...

AutoConvertibleString getCompanyName() { /* ... whatever ... */ }

それは醜いハックです。それらをすべて関数に変換する方が本当に良いでしょう。しかし、それはうまくいくはずです。

于 2013-10-07T12:10:50.970 に答える
2

PRODUCTマクロが展開されます

getCompanyName(); L" in Canada"

それで

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

版画

Test Company

予想通り。

C++ では、次の傾向があります。

  • マクロを避ける (代わりにインライン関数を使用する)
  • ネイキッド ポインターを避ける (STL 機能を優先)

したがって、C++ では次のことを優先します。

inline const std::wstring getCompanyName() { return L"Test Company";}
inline const std::wstring PRODUCT() { return getCompanyName() + L" in Canada";}
于 2013-10-07T11:01:07.970 に答える