2013-08-07 4 views
0

Я "пишу программу, которая широко, зависит от идентификатора:.Проблема с помощью #define идентификатора в C++

#define NUMBER_OF_ELEMENTS 12 

Параметр используется в ряде проектов (в одном решении) Проблема является то, что у меня есть два режима: первый NUMBER_OF_ELEMENTS составляет 12 и второй NUMBER_OF_ELEMENTS равна 16.

есть ли способ, чтобы изменить значение параметра во время выполнения, если не существует какой-либо работы вокруг

?

Заранее благодарен

+1

нет, не во время выполнения. Директивы '# define' интерпретируются компилятором и не могут быть изменены после компиляции программы. – Nbr44

+0

Runtime - не с макро. Почему вы не можете использовать переменную? Это для массива? В этом случае вы не можете выбрать размер во время выполнения, используйте ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). – BoBTFish

+2

@ Nbr44 компилятор даже не видит '# определяет', он просто видит кучу' 12 '. – juanchopanza

ответ

6

#define содержит константы для предварительного процессора. Они недоступны во время выполнения или непосредственно самому компилятору.

Вам нужно будет использовать переменную времени выполнения, если вы хотите, чтобы это значение было изменено во время выполнения. Лучший способ определить это во многом зависит от структуры вашей программы.

1

Макросы C++ используются во время компиляции, если вам нужно что-то, что вы можете изменить во время выполнения, вы можете создать глобальную или статическую переменную.

2

Как уже говорилось, вы не можете изменить это значение во время выполнения, поскольку препроцессор изменяет NUMBER_OF_ELEMENTS с 12/16 перед компиляцией.

Вы можете начать с изменения NUMBER_OF_ELEMENTS до глобального const. Разумеется, это не будет довольно хорошим решением, но вы можете взять его оттуда (возможно, какой-то объект управляет им, я не могу больше сказать, не зная о специфике вашей программы).

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 
Смежные вопросы