2015-05-22 3 views
0

Можем ли мы понять, существует ли упомянутая переменная/создана/существует?
Я имею в виду что-то вроде этого:Можно ли проверить наличие переменных?

//..Some codes 
int main(){ 
    int var1; 
    float var2; 
    char var3; 
    cout << isExist("var1") << endl;//Or isExist(/*Something related with var1*/) 
    cout << isExist("var2") << endl; 
    cout << isExist("var3") << endl; 
    cout << isExist("var456") << endl;//There is no variable named with var456 
    return 0; 
} 

Выход:

true 
true 
true 
false 
+4

Какая большая вещь вы пытаетесь сделать? – chris

+1

На заметке, обратите внимание на ошибку компилятора (вы не указали _runtime_). :-) –

+2

В этом примере вместо 'cout << isExist (" var1 ")', вы можете написать 'cout << var1'. Если код компилируется, существует 'var1'; если он не компилируется, 'var1' не существует. - Дело в том, что в любой точке кода все переменные, которые существуют, известны во время компиляции, и ничего не узнается во время выполнения.Поэтому возникает вопрос, почему вы хотите протестировать что-то вроде этого во время выполнения, а не во время компиляции. –

ответ

7

No. C и C++ не поддерживает reflection.

+0

Это выходит далеко за рамки размышлений –

0

В C/C++ доступ к переменной, не заданной, приведет к ошибке компилятора. Таким образом, в некотором смысле это присуще тому, как это работает. Вы не можете сделать это во время выполнения, по крайней мере, не так, как вы пытаетесь сделать, и не должны быть нужны, потому что вы не можете назвать новые переменные во время выполнения в первую очередь, поэтому вы уже должны знать переменные там.

Единственный способ сделать это будет косвенно с помощью макросов. Макросы не могут проверить, определена ли сама переменная, но определение может быть сопряжено с определением переменной, и вы можете проверить маркер определения.

#define A_VARIABLE 1 
int a_variable = 60; 

И позже:

#ifdef A_VARIABLE 
... 
#endif 

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

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

0

«Язык программирования C» - это читаемая человеком форма предоставления инструкций компьютеру. Все имена в программе имеют смысл только в тексте программы.

При компиляции имена заменяются символической ссылкой на место или функцию хранения (начальная точка выполнения). Любой символ, не найденный в текущем модуле компиляции (объектный модуль), помечен для будущего разрешения.

Объектные модули объединены (связаны) в исполняемый файл, где все ссылки на символы, не находящиеся в объектном модуле, разрешаются с использованием местоположений в других объектных модулях; в противном случае создание исполняемого файла не выполняется.

С тех пор все имена заменены ссылками на места хранения и начальные точки выполнения, исполняемый файл больше не знает об именах, используемых в тексте программы, чтобы ссылаться на его места и функции хранения.

Любая возможность сделать это («отражение», как называет его пользователь @ Bill-Lynch) будет «прикреплен» к языку/среде как отдельный слой, например, предоставленный средой отладки/разработки.

Смежные вопросы