C macro – проверка, является ли переменная указателем или нет.

Просто начал думать об этом и задавался вопросом, есть ли какой-нибудь «хороший» способ проверить, передана ли переменная макросу в c, указателем? то есть:

#define IS_PTR(x) something int a; #if IS_PTR(a) printf("a pointer we have\n"); #else printf("not a pointer we have\n"); #endif 

Идея заключается не в том, что это делается во время выполнения, а во время компиляции, как в: мы получаем другой код в зависимости от того, является ли указатель переменной или нет. Поэтому я хотел бы, чтобы IS_PTR () каким-то образом оценивал какое-то постоянное выражение. Я иду об этой идее не так?

Возможно ли это и как это сделать в этом случае? Заранее спасибо!

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

C11 имеет новую функцию, которая позволяет вам наблюдать определенный тип указателя, но не «pointerness» в целом. Например, вы можете что-то сделать

 #define IS_TOTOP(X) _Generic((X), default: 0, struct toto*: 1) 

или если вы хотите, чтобы макрос также работал для массивов

 #define IS_TOTOPA(X) _Generic((X)+0, default: 0, struct toto*: 1) 

Есть уже некоторые компиляторы, которые реализуют это, а именно clang, а для gcc и других вы уже можете подражать этой функции с некоторыми встроенными функциями, см. P99 .

NULL – это почти единственное, что вы можете найти. Невозможно определить, является ли что-то указателем.