0

私は識別子に大きく依存するプログラムを書いています:

#define NUMBER_OF_ELEMENTS 12

パラメータは、多くのプロジェクトで (1 つのソリューションで) 使用されます。問題は、2 つのモードがあることです。最初の NUMBER_OF_ELEMENTS は 12 で、2 番目の NUMBER_OF_ELEMENTS は 16 です。

実行時にパラメータの値を変更する方法はありますか? そうでない場合、回避策はありますか?

前もって感謝します!

4

4 に答える 4

6

#defineプリプロセッサに定数を提供します。これらは、実行時に、またはコンパイラ自体から直接利用することはできません。

この値を実行時に変更する場合は、ランタイム変数を使用する必要があります。これを定義する最善の方法は、プログラムの構造に大きく依存します。

于 2013-08-07T12:57:02.337 に答える
2

プリプロセッサはコンパイル前に NUMBER_OF_ELEMENTS を 12 / 16 に変更するため、実行時にこの値を変更できないと他の人が既に言っているように。

NUMBER_OF_ELEMENTS をグローバル const に変更することから始めることができます。もちろん、それもかなりの解決策ではありませんが、そこから取得できます(おそらく、それを管理するオブジェクト、プログラムの詳細を知らずに詳細を知ることはできません)。

于 2013-08-07T13:01:18.940 に答える
1

多くのコードが決定的に依存する整数パラメーターの場合、実行時に変更するには、理想的にはテンプレートを使用して、ある実装から別の実装に変更するのが最善です。

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
于 2013-08-07T13:52:45.787 に答える
1

C++ マクロはコンパイル時に使用されます。実行時に変更できるものが必要な場合は、グローバル変数または静的変数を作成できます。

于 2013-08-07T12:57:18.703 に答える