Вот макрос, который я хочу использовать, если X_DEFINED определен, он будет оцениваться как DEFAULT_X, в противном случае он будет оцениваться как x
#define GET_X(x) (defined(X_DEFINED) ? DEFAULT_X : x)
Не компилируется с ошибкой
error: 'X_DEFINED' was not declared in this scope
Какие-либо предложения? Я хочу иметь возможность выбирать между параметром и глобальной переменной в зависимости от того, определен ли X_DEFINED или нет
Кстати, эта строка сама по себе не вызывает никаких ошибок. Укажите минимальный воспроизводимый пример





defined() работает только в #if и подобных директивах препроцессора.
Вы хотите что-то вроде этого:
#ifdef X_DEFINED
#define GET_X(x) DEFAULT_X
#else
#define GET_X(x) x
#endif
Re: «defined() работает только в #if» — действительно. И код может быть написан как с #if defined(X_DEFINED), так и с #ifdef X_DEFINED.
Вам нужно определить 2 разных макроса, в зависимости от того, определен ли X_DEFINED:
#ifdef X_DEFINED
# define GET_X(x) x
#else
# define GET_X(x) DEFAULT_X
#endif
Небрежно говоря, вы смешиваете материал времени выполнения (вычисление тернарного оператора) с материалом, который происходит еще до компиляции (препроцессор). Вместо этого вы можете использовать #ifdef:
#ifdef X_DEFINED
#define GET_X(x) DEFAULT_X
#else
#define GET_X(x) x
#endif
предложение: дайте нам знать, для чего вы на самом деле хотите это использовать, чтобы мы могли сказать вам, как это сделать без макросов