1

マクロ パラメーターに基づいて関数と変数を生成するプリプロセッサ マクロを取得しました。

A、B でマクロを連続して呼び出すと、マクロは次のようなものを生成します

Inst* AActivate() { ... }
bool Atemp;

Inst* BActivate() { ... }
bool Btemp;

マクロはヘッダー ファイル内で定義されているため、既に定義されているシンボルについて通知するリンカ エラーが発生します。#pragma once を使用していますが、問題はヘッダー内の関数の実装にあると思います。

マクロは次のとおりです。

    #define REGISTER(ns, id, type) \
        Inst* type##Activate() { return new type(); }\
        bool type##temp = RegisterType(ns << 8 | id, &type##Activate);

今、私はそのような問題にどのように対処するかを考えました。私の最初のアイデアは、いくつかの #define-Guard を使用することでしたが、明らかにこれにはネストされた #defines が必要であり、これは C++ では不可能です。ブーストで可能な解決策について読みましたが、残念ながら、これらのライブラリを使用できません。

何か案が?

前もって感謝します...

4

3 に答える 3

3

マクロはヘッダーに関数定義を生成し、通常の関数と同様に、ヘッダーが複数の変換単位に含まれる場合、ヘッダー内のインライン化されていない関数は ODR に違反します。したがって、生成された関数をインラインにするだけです。

ODR が適用されるグローバル変数についても、内部リンケージを取得するためにそれらを static または const として宣言する必要があります。これにより、ヘッダーが含まれる翻訳単位ごとに、変数の複数の独立したインスタンスが得られます。とにかく、グローバル変数は悪いスタイルと見なされているので、別のことを考えたほうがいいかもしれません。

于 2013-08-30T09:44:34.943 に答える
0

マクロを .cpp ファイルで使用するか、関数をインライン化します。#pragma once を使用しても、ヘッダーが .cpp ファイルごとに複数回インクルードされるのを防ぐだけなので、あまり役に立ちません。複数の .cpp ファイルをコンパイルすると、関数が複数回定義されます。

于 2013-08-30T09:44:54.033 に答える