В системном заголовочном файле Linux определена следующая структура /usr/include/sys/inotify.h
:
struct inotify_event
{
int wd;
uint32_t mask;
uint32_t cookie;
uint32_t len;
char name __flexarr;
};
Обратите внимание на последнее поле name
, , которое является массивом нулевой длины . C ++ 17 не поддерживает массив нулевой длины, поэтому, если использовать struct inotify_event
в проекте C ++ 17 и компилировать его с -pedantic
, должно появиться предупреждение компилятора.
Однако следующий код не вызывает никаких предупреждений для struct inotify_event
. Еще более странно, если я определю структуру, используя массив нулевой длины, предупреждение будет выдано, как и ожидалось.
Опции компилятора: clang ++ -std = c ++ 17 -pedantic main.cpp
#include <sys/inotify.h>
struct inotify_event* p = nullptr; // no warning
struct A
{
int x;
char name __flexarr; // warning: flexible array members are a C99 feature
};
int main()
{}
Есть ли какая-то магия в clang ++, которая обрабатывает системные заголовки более непринужденно?