私は識別子に大きく依存するプログラムを書いています:
#define NUMBER_OF_ELEMENTS 12
パラメータは、多くのプロジェクトで (1 つのソリューションで) 使用されます。問題は、2 つのモードがあることです。最初の NUMBER_OF_ELEMENTS は 12 で、2 番目の NUMBER_OF_ELEMENTS は 16 です。
実行時にパラメータの値を変更する方法はありますか? そうでない場合、回避策はありますか?
前もって感謝します!
私は識別子に大きく依存するプログラムを書いています:
#define NUMBER_OF_ELEMENTS 12
パラメータは、多くのプロジェクトで (1 つのソリューションで) 使用されます。問題は、2 つのモードがあることです。最初の NUMBER_OF_ELEMENTS は 12 で、2 番目の NUMBER_OF_ELEMENTS は 16 です。
実行時にパラメータの値を変更する方法はありますか? そうでない場合、回避策はありますか?
前もって感謝します!
#define
プリプロセッサに定数を提供します。これらは、実行時に、またはコンパイラ自体から直接利用することはできません。
この値を実行時に変更する場合は、ランタイム変数を使用する必要があります。これを定義する最善の方法は、プログラムの構造に大きく依存します。
プリプロセッサはコンパイル前に NUMBER_OF_ELEMENTS を 12 / 16 に変更するため、実行時にこの値を変更できないと他の人が既に言っているように。
NUMBER_OF_ELEMENTS をグローバル const に変更することから始めることができます。もちろん、それもかなりの解決策ではありませんが、そこから取得できます(おそらく、それを管理するオブジェクト、プログラムの詳細を知らずに詳細を知ることはできません)。
多くのコードが決定的に依存する整数パラメーターの場合、実行時に変更するには、理想的にはテンプレートを使用して、ある実装から別の実装に変更するのが最善です。
code.h で:
#include <stdexcept>
template<int NumberOfElements>
struct ComplicatedCode
{
void run(int, char**);
};
void RunComplicatedCode(int NumberOfElements, int argc, char**argc)
{
switch(NumberOfElements) {
case 12: ComplicatedCode<12>::run(argc,argv); break;
case 16: ComplicatedCode<16>::run(argc,argv); break;
default: throw std::invalid_argument();
}
}
code.cc:
#include "code.h"
template<int NumberOfElements>
void ComplicatedCode::run(int argc, char**argv)
{
/* implementation details, depending on NumberOfElements */
}
template void ComplicatedCode<12>::run(int, char**); // instantination for 12
template void ComplicatedCode<16>::run(int, char**); // instantination for 16
C++ マクロはコンパイル時に使用されます。実行時に変更できるものが必要な場合は、グローバル変数または静的変数を作成できます。