В проекте, над которым я работаю, я только что столкнулся с конфликтом переопределения, и, отслеживая, почему это не происходит на всех платформах (оказалось, что это касается порядка включений), я наткнулся на следующее поведение, которое я не могу объяснить.
1. компилируется без предупреждений
#define LIST_HEAD(a) { int a = 0; }
#include <sys/queue.h>
int main() {
return 0;
}
2. Предупреждение о макроопределении
#include <sys/queue.h>
#define LIST_HEAD(a) { int a = 0; }
int main() {
return 0;
}
Я ожидал бы, что оба случая выдадут предупреждение, поскольку в <sys/queue.h>
нет проверок, которые предотвратили бы переопределение.
Итак, почему первый случай не вызывает предупреждения, а второй? Что мне здесь не хватает?
Btw: Я получаю те же результаты на своем Mac с clang и моей Linux-коробкой с gcc.