#ifdef
можно использовать, чтобы определить, является ли строка определением макроса. Но у меня есть несколько определений макросов, как мне определить, было ли содержимое переменной определено макросом.
например,
char *str = "Macro"
#ifdef (*str)
Есть ли способ добиться аналогичной функциональности?
Нет, мне нужно много макросов, чтобы установить какие-то флаги. Когда я хочу установить бит, я могу просто использовать #define bit_name
О, вы хотите, чтобы #ifdef (*str)
действовал как #ifdef Macro
? Это невозможно.
Итак, я говорю о том, существует ли аналогичный метод, которого можно достичь? похожий?
Прекратите использовать макросы для вещей, для которых они не предназначены. Как правило, вы должны свести использование макросов к минимуму, и то, что вы хотите здесь, явно не макрос. Вы можете использовать шаблоны и функции constexpr для выполнения проверок во время компиляции.
Ты прав. Вместо этого я пытался использовать массив или перечисление.
"...определить, является ли строка определением макроса" Нет. Вы не можете передать строку в ifdef
. Строка будет заключена в кавычки. Вы имеете в виду идентификатор, а не строку.
char *str = "Macro"
#ifdef (*str)
Это никогда не сработает, так как str
— это не макрос! Синтаксис для *str
не будет принят препроцессором. Кстати: в C++ char *str = "Macro"
тоже неправильно, так как вы должны использовать const char*
!
В целом: избегайте макросов, так как они подвержены ошибкам. У них нет типа, и они являются частью некоторых функций замены текста, далеких от типов в C++.
как я могу судить, было ли содержимое переменной определено макросом
Нет variable
в смысле препроцессора. И вы не можете проверить переменные C++ в препроцессоре, потому что препроцессор вообще ничего не знает о C или C++. Это всего лишь более или менее простой инструмент замены текста, который запускается до того, как сам код C++ будет проанализирован компилятором, даже если обе части, препроцессор и анализатор C++, физически находятся в одной программе.
Итак, я говорю о том, существует ли аналогичный метод, которого можно достичь?
Нет! Вы не можете проверить, существует ли переменная или нет. Если он не существует, вы всегда получаете ошибку компиляции. Вы можете проверить значение или тип переменной, например. с SFINAE, но не существование самой переменной.
Но каков реальный вариант использования? Ваши вопросы показывают нам, как вы думаете, вы бы что-то реализовать, но не почему и что?
Зачем тебе это нужно? Также в вашем коде нет макросов.