我正在编写一个广泛依赖于标识符的程序:
#define NUMBER_OF_ELEMENTS 12
该参数用于许多项目(在一个解决方案中)。问题是我有两种模式:第一个 NUMBER_OF_ELEMENTS 是 12,第二个 NUMBER_OF_ELEMENTS 等于 16。
有没有办法在运行时更改参数的值?如果没有,是否有任何解决方法?
提前致谢!
我正在编写一个广泛依赖于标识符的程序:
#define NUMBER_OF_ELEMENTS 12
该参数用于许多项目(在一个解决方案中)。问题是我有两种模式:第一个 NUMBER_OF_ELEMENTS 是 12,第二个 NUMBER_OF_ELEMENTS 等于 16。
有没有办法在运行时更改参数的值?如果没有,是否有任何解决方法?
提前致谢!
#define
为预处理器提供常量。它们在运行时或直接对编译器本身不可用。
如果您希望在运行时更改此值,则需要使用运行时变量。定义它的最佳方式很大程度上取决于程序的结构。
正如其他人已经说过的那样,您不能在运行时更改此值,因为预处理器在编译之前将 NUMBER_OF_ELEMENTS 更改为 12 / 16。
您可以从将 NUMBER_OF_ELEMENTS 更改为全局常量开始。它当然也不是一个很好的解决方案,但是您可以从那里获取它(也许是一些管理它的对象,如果不了解您的程序的细节,我真的无法说出更多信息)。
对于很多代码严重依赖的整数参数,在运行时更改最好通过从一种实现更改为另一种实现,理想情况下使用模板:
在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++ 宏在编译时使用,如果您需要在运行时更改的内容,您可以创建全局或静态变量。