0

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

#define NUMBER_OF_ELEMENTS 12

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

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

提前致谢!

4

4 回答 4

6

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

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

于 2013-08-07T12:57:02.337 回答
2

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

您可以从将 NUMBER_OF_ELEMENTS 更改为全局常量开始。它当然也不是一个很好的解决方案,但是您可以从那里获取它(也许是一些管理它的对象,如果不了解您的程序的细节,我真的无法说出更多信息)。

于 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 回答