1

私はプリプロセッサ関数のようなマクロを試しているので、通常の関数を前方に宣言するマクロを作成しようとしています。しかし、コンパイルに行くと、2行目は正しくない構文であると表示されます。

私は何が間違っているのですか?

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) "int" #fName "(int id, string msg, string cmd);"
FORWARD_DECLARE_CUSTOM_FUNCT("abc") // LINE 2: Should become "int abc(int id, string msg, string cmd);"

void test()
{
    abc(1, "", "");
}
4

3 に答える 3

3

問題はすべて引用符です。

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) "int" #fName "(int id, string msg, string cmd);"

次のように変換されます(文字列リテラルを連結した後):

"int abc (int id, string msg, string cmd);"

一方、

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) int #fName (int id, string msg, string cmd);

次のように変換されます。

int "abc" (int id, string msg, string cmd);

本当に必要なのは単純です。

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) int fName (int id, string msg, string cmd);

次のように使用します。

FORWARD_DECLARE_CUSTOM_FUNCT(abc)

それはすべて単なるテキスト置換です。マクロ内のセミコロンを個人的に削除し、使用するたびにユーザーにセミコロンを挿入して、ステートメントのようにします。それは私にとってより自然に感じます。

于 2013-02-11T04:29:45.677 に答える
3

これを実行しようとしている場合は、の-Eフラグを使用することをお勧めしg++ます(gcc、MSVC、または使用しているコンパイラーを使用している場合は、同様のものがあります)。これにより、プリプロセッサがファイルを実行した後にファイルが出力されます。

とにかく、あなたが探しているのは次のようなものです:

//No #
#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) void fName(int id, string msg, string cmd);

FORWARD_DECLARE_CUSTOM_FUNCT(abc) //No ""

void test()
{
    abc(1, "", "");
}
于 2013-02-11T04:30:06.713 に答える
2

あなたは文字列化から逃れる必要があります。名前に文字列を使用して関数を作成することはありません。そのような関数をその表記でプリプロセッサに記述しないでください。

プリプロセッサからの出力を見てください。

g++ -E yourfile.cpp

またはそれに相当するもの。2行から得られる出力は次のとおりです。

"int" "\"abc\"" "(int id, string msg, string cmd);"

そして、それは関数宣言とはあまり似ていません。これは、関数宣言に似たものを含む文字列です(ただし、ネストされた二重引用符はそれでも混乱します)。

少しクリーンアップ:

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) int fName(int id, string msg, string cmd)
FORWARD_DECLARE_CUSTOM_FUNCT(abc);

マクロ定義からマクロ呼び出しへのセミコロンの転送に注意してください。これは、経験豊富なC ++プログラマーには見栄えがします(ただし、マクロはC ++プログラマーにとっては嫌悪感のようなものですが、Cプログラマーにとってはより受け入れやすいものです)。

于 2013-02-11T04:30:03.027 に答える