0

私が達成しようとしているのは、コードに記載されているこれら 3 つのクラスの作成ですが、プリプロセッサを便利に使用して、これらの同様のクラスを個別のコードを記述するのではなく作成して実行できるようにすることです。

#include <iostream>
#define MYMACRO(len,baselen)
using namespace std;

class myclass ## len
{
    int MYVALUE ## baselen;
    public:
        myclass ## len ## ()
        {
            cout << endl;
            cout << " For class" ## len ## "'s function 'myFunction" ## len ## "' the value is: " << MYVALUE ## baselen << endl;
        }
};

int main()
{
    MYMACRO(10,100)
    //myclass10 ob1;
    MYMACRO(20,200)
    //myclass20 ob2;
    MYMACRO(30,300)
    //myclass30 ob3;

    myclass10 ob1;
    myclass20 ob2;
    myclass30 ob3;

    cout << endl;

    return 0;
}

このエラーが発生しているため、実行できるかどうかはわかりません。はいの場合は、誰かがエラーを解決し、いいえの場合は教えてください。同じ理由を教えてください。同じページにいることも安心です! エラーは次のとおりです。

[root@localhost C++PractiseCode]# g++ -o structAndPreprocessor structAndPreprocessor.cpp
structAndPreprocessor.cpp:5: error: invalid token
structAndPreprocessor.cpp:6: error: invalid function declaration
structAndPreprocessor.cpp:7: error: invalid token
structAndPreprocessor.cpp:9: error: invalid token
structAndPreprocessor.cpp:9: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp: In function `int main()':
structAndPreprocessor.cpp:25: error: `myclass10' was not declared in this scope
structAndPreprocessor.cpp:25: error: expected `;' before "ob1"
structAndPreprocessor.cpp:26: error: `myclass20' was not declared in this scope
structAndPreprocessor.cpp:26: error: expected `;' before "ob2"
structAndPreprocessor.cpp:27: error: `myclass30' was not declared in this scope
structAndPreprocessor.cpp:27: error: expected `;' before "ob3"
[root@localhost C++PractiseCode]#
4

2 に答える 2

5

\マクロを定義するには、行の両端で使用する必要があります (マクロから using ステートメントを削除する可能性があります)。

using namespace std;

#define MYMACRO(len,baselen) \
class myclass ## len \
{ \
    int MYVALUE ## baselen; \
(...snip...)       \
   }\
}; 

最後の行にエスケープがないことに注意してください

ほとんどの場合、Cpp を使用しており、マクロの使用はお勧めできません。テンプレートまたは従来の動的コードのいずれかを使用することをお勧めします (必要に応じて)。マクロと比較して、テンプレートはコンパイル時に追加の型チェックを行い、はるかに読みやすいエラー メッセージを提供します。

于 2013-11-07T08:08:56.687 に答える
0

あなたが提示するマクロソリューションは、私が以前に使用したソリューションですが、これに別の方法でアプローチすることを検討します. マクロ ソリューションは扱いにくく、最も単純なコードを除いてすべての保守とデバッグが困難です。

テンプレートから必要なコードを生成することを考えたことがありますか? Cheetah または Mako を使用してソース テンプレートに入力すると、かなりクリーンになり、構成ファイルから生成を実行できるため、クラスのリストを手動で管理する必要がなくなります。

次のような myclass.tmpl テンプレート ファイルがあります。

#for len, baselen in enumerate(mylist_of_classes_i_want_to_generate)
class MyClass$len
{
    int MYVALUE$baselen;
    public:
        MyClass$len()
        {
            cout << endl;
            cout << " For class $len's function 'myFunction $len' the value is: " << MYVALUE$baselen << endl;
   }
};
#end for

次に、コンパイル前のビルド フローの開始時にコードを自動生成するために cheetah を呼び出します。

于 2013-11-07T08:28:51.857 に答える