私はコード全体に散在する関数を持っています。これは開発に使用されますが、私は最終的なシステムで実行したくありません。これを行う1つの方法は、マクロである:C++空の実装で関数を選択的に置き換える方法
#if SPEAK_ENABLED
#define speak(m) implementation(m)
#else
#define speak(m) ((void)0)
#endif
これはうまく動作しますが、私は同様の動作を取得するために使用することができます(おそらく、テンプレートを使用して)他のメカニズムがあります場合、私は思っていました。
私が試したことは、関数を宣言してから、すべてのメイン.cppファイルに実装を提供することでした。
enable.h:
void speak()
{
std::cout << "Output enabled" << std::endl;
}
disable.h:
void speak()
{
}
silent_main.h:
#include "disable.h"
int main(int argc, char *argv[])
{
speak();
return 0;
}
talking_main.h:
#include "enable.h"
int main(int argc, char *argv[])
{
speak();
return 0;
}
例えば
これは上記のような単純なケースで機能しますが、リンクされているときに関数の定義が不足していると不平を言うため、ライブラリでは機能しません。
これは基本的に私の使用例です。私は1つの実行可能なターゲットに対してこの機能を無効にしたいが、他のすべてのターゲットに対しては有効にしたい。
これは、マクロを使用することが正当な理由の1つですか?
あなたのマクロの例は実際には間違っています - '#if'ブランチでは、拡張コマンドをセミコロンで終了してはならず、'#else'ブランチではノーオペレーション '((void)0 ) '代わりに – UnholySheep
情報をありがとう。それは理にかなっている。私はすぐに他の場所からそれをコピーしました。私はそれを修正するために編集します。 – user2445507