ПРИМЕЧАНИЕ: это НЕ дубликат вопроса, связанного Полом Т., потому что я спрашиваю, возможно ли определить, имеет ли тип определенный более широкий неполный тип / вид во время компиляции,нет, если символ был зарегистрирован во время компиляции.Это похоже на фундаментальное недопонимание вопроса.
Я пишу библиотеку на C, которая имеет дело с псевдообщими функциями, которые принимают тип в качестве аргумента через оболочку макроса.
Чтобы сэкономитьВ деталях (потому что они довольно сложные) есть две возможные функции, которые могут помочь, я думаю:
Возможность определить, является ли тип указателем во время компиляции.(Нет, трюк «использовать _Generic для проверки, если вы получите ptrdiff_t из вычитания» не будет работать, потому что структуры возможны, и вы не можете вычесть структуры.)
Существовозможность определить, является ли тип структурой во время компиляции.(Если бы это было возможно, то вышеупомянутый трюк _Generic мог бы использоваться, если тип был обнаружен как не являющийся структурой.)
Я перепробовал все, что мог придумать на Годболте (даже пытаясь сравнить типы с неполными анонимными структурами и играть с __builtin_types_compatible_p) и не смог найти никаких решений.
Если у кого-то есть какие-либо решения, я бы с удовольствием их увидел, в противном случае я мог бы просто получитьнемного усложнить дизайн - так что не конец света, если это невозможно, но было бы идеально, если это можно сделать.
Чтобы дать общее представление о том, как может выглядеть один из этих макросовили ожидаемый результат:
int *a;
assert(!IS_STRUCT(a));
assert(IS_POINTER(a));
struct {} b;
assert(IS_STRUCT(b));
assert(!IS_POINTER(b));
не должен выдавать никаких ошибок.