Ответ 1
Поскольку предварительные объявления структур могут повторяться столько раз, сколько мы хотим, вы можете использовать фиктивное объявление:
#define STATIC_ASSERT(cond) struct GlobalScopeNoopTrick
@JonathanLeffler говорит, что это должно работать в старых компиляторах, даже до C11... но:
"Если у вас есть компилятор C90, он будет возражать, если у вас есть статическое утверждение после оператора в составном операторе. Это не ваша основная задача (всегда будет нормально работать с областью файла, если статическое утверждение тоже хорошо), но это не ограничивается использованием в области видимости файла. Однако риск невелик "
Для связанных ситуаций, которые могут не быть полностью недоступными во время компиляции, C11 ввел возможность повторять typedefs. И, как показано в посте, связанном со статическими утверждениями в C до _Static_assert(), есть способы обойти дублирование typedef для старых C, используя номер строки или другой неоднозначный аргумент:
/* Standard indirection to allow concatenation after expansion */
#define CONCAT(a,b) CONCAT_(a,b)
#define CONCAT_(a,b) a##b
#if defined(__cplusplus) && __cplusplus >= 201103L
#define STATIC_ASSERT(cond) \
static_assert((cond), #cond)
#else
#define STATIC_ASSERT(cond) typedef void CONCAT(dummy_unused_,__LINE__)
#endif
Пока статические утверждения появляются по одному на строку, идентификаторы не будут конфликтовать друг с другом.