c ++中的#defined标识符问题

时间:2013-08-07 12:53:56

标签: c++

我正在编写一个广泛依赖于标识符的程序:

#define NUMBER_OF_ELEMENTS 12

该参数用于许多项目(在一个解决方案中)。 问题是我有两种模式:第一个NUMBER_OF_ELEMENTS为12,第二个NUMBER_OF_ELEMENTS等于16。

有没有办法在运行时更改参数的值?如果不是有任何解决方法吗?

提前致谢!

4 个答案:

答案 0 :(得分:6)

#define为预处理器提供常量。它们在运行时或编译器本身不可用。

如果希望在运行时更改此值,则需要使用运行时变量。定义此方法的最佳方式取决于程序的结构。

答案 1 :(得分:2)

正如其他人已经说过的那样,你无法在运行时更改此值,因为预处理器会在编译之前将NUMBER_OF_ELEMENTS更改为12/16。

您可以从将NUMBER_OF_ELEMENTS更改为全局const开始。它当然不是很好的解决方案,但你可以从那里拿它(可能有一些对象管理它,如果不知道你的程序的具体细节,我真的无法说出更多)。

答案 2 :(得分:1)

C ++宏用于编译时,如果你需要在运行时可以改变的东西,你可以创建一个全局变量或静态变量。

答案 3 :(得分: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