Можно ли проверить наличие переменных?

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

//..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

0

Решение

Нет. C и C ++ не поддерживают отражение.

7

Другие решения

Не в C / C ++. Но вы можете взглянуть на библиотеку Boost Reflect. http://bytemaster.bitshares.org/boost_reflect/

0

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

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

#define A_VARIABLE 1
int a_variable = 60;

И позже:

#ifdef A_VARIABLE
...
#endif

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

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

0

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

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

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

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

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector