Аналог PHP isset () в C / C ++ - PullRequest
       8

Аналог PHP isset () в C / C ++

6 голосов
/ 23 октября 2008

PHP имеет очень хорошую функцию isset ($ variableName). Он проверяет, определено ли уже в переменной $ variableName.

Можем ли мы создать аналогичную функцию для C / C ++ (какой-то поиск таблицы символов)?

Ответы [ 8 ]

12 голосов
/ 23 октября 2008

Я парень C ++, но я помню, что в PHP isset используется для проверки, содержит ли переменная значение при передаче через запрос get / post (я уверен, что есть и другие варианты использования, но это распространенное явление) Я верю).

У вас нет динамической типизации в C ++. Таким образом, вы не можете внезапно использовать имя переменной, которое вы ранее не указали явно. В C ++ действительно нет такой вещи, как «неустановленная» переменная.

Даже если вы говорите «int var;» и не инициализируйте его, переменная имеет значение, обычно мусор, но она все еще «установлена» в смысле PHP.

Закрытия, я полагаю, были бы #ifdef и #ifndef препроцессора, который проверяет только то, что вы определили переменную, используя #define. Но по моему опыту это в основном используется для пропуска или добавления кода на основе флагов. Например:

// code code code
#ifdef DEBUG
// debug only code that will not be included in final product.
#endif
// more code more code

Вы можете определить DEBUG, используя #define, чтобы определить, включать ли код "DEBUG" сейчас.

Возможно, если вы немного больше расскажете о том, что вы пытаетесь сделать с эквивалентом isset в C ++, это даст вам более полное представление о том, как это сделать "Путь C ++".

5 голосов
/ 23 октября 2008

Нет прямого способа сделать это на языке. Тем не менее, это можно сделать, используя карту, такую ​​как:

typedef std::map<std::string, int> variables_type;
variables_type variables;

variables["var"] = 1;
if(variables.find("jon") == variables.end())
   std::cout << "variable, \"jon\" not set\n";

Чтобы сделать эту переменную похожей на те, которые используются в PHP или javascript, реализация должна будет использовать какой-то тип варианта.

3 голосов
/ 23 октября 2008

Не совсем. Вы не можете динамически создавать переменные (хотя вы можете динамически создавать хранилище с помощью malloc () и др. Или new и др. В C ++) в C. Я полагаю, что динамически загружаемые библиотеки размывают картинку, но даже там, как вы устанавливаете переменная существует путем поиска ее имени. Если имени там нет, то, кроме запуска компилятора для создания динамически загружаемого модуля и последующей его загрузки, вы, вероятно, застряли. Концепция действительно не относится к C или C ++.

1 голос
/ 23 октября 2008

Ну, всегда есть Boost.Optional

http://www.boost.org/doc/libs/1_36_0/libs/optional/doc/html/index.html

, который должен почти делать то, что вы хотите.

1 голос
/ 23 октября 2008

Как сказано в других ответах, в C ++ переменные никогда не определены. Однако переменные могут быть неинициализированы, и в этом случае их содержимое не указывается в языковом стандарте (и реализуется большинством компиляторов так, как будто они хранятся в этом месте памяти).

Обычно компилятор предлагает флаг для обнаружения возможных неинициализированных переменных и генерирует предупреждение, если это включено.

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

Наконец, вам может потребоваться нулевой указатель. Для этого просто используйте простое сравнение:

int * x(getFoo());
if (x) {
  cout << "Foo has a result." << endl;
} else {
  cout << "Foo returns null." << endl;
}
0 голосов
/ 24 октября 2008

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

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

0 голосов
/ 23 октября 2008

Здесь нужно разделить две вещи: переменную объявление и переменную содержимое .

Как сказано в других ответах, в отличие от PHP, C ++ не позволяет использовать переменную до ее объявления.

Но кроме этого, он может быть неинициализирован.

Я думаю, что функция PHP isset пытается выяснить, имеет ли переменная полезное значение. В C ++ это лучше всего соответствует тому, что указатель равен NULL или действителен.

0 голосов
/ 23 октября 2008

Краткий ответ: НЕТ

Стандартный контрольный вопрос: Какую проблему вы действительно пытаетесь решить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...