Я исправлял некоторый код, и компилятор предупреждал (законно) о том, что функция dynscat()
не была объявлена - кто-то еще понимает приемлемый стандарт кодирования - поэтому я отслеживал, где функция определена (достаточно простая) и который заголовок объявил (нет, Grrr!). Но я ожидал найти детали определения структуры, необходимые для объявления extern
qqparse_val
:
extern struct t_dynstr qqparse_val;
extern void dynscat(struct t_dynstr *s, char *p);
extern void qqcat(char *s);
void qqcat(char *s)
{
dynscat(&qqparse_val, s);
if (*s == ',')
dynscat(&qqparse_val, "$");
}
Функция qqcat()
в исходном коде была статической; выражение extern подавляет предупреждение компилятора для этого фрагмента кода. Объявление функции dynscat()
вообще отсутствовало; снова, добавив, что он подавляет предупреждение.
С показанным фрагментом кода ясно, что используется только адрес переменной, поэтому имеет смысл на одном уровне, что не имеет значения, что детали структуры неизвестны. Если бы переменная extern struct t_dynstr *p_parseval;
, вы бы не увидели этого вопроса; что будет на 100% ожидаемым. Если код необходим для доступа к внутренним структурам структуры, то потребуется определение структуры. Но я всегда ожидал, что если вы заявите, что переменная была структурой (а не указателем на структуру), компилятор хотел бы знать размер структуры - но, по-видимому, нет.
Я пытался спровоцировать GCC на жалобы, но это не так, даже GCC 4.7.1:
gcc-4.7.1 -c -Wall -Wextra -std=c89 -pedantic surprise.c
Код компилируется в AIX, HP-UX, Solaris, Linux в течение десятилетия, поэтому он не является специфичным для GCC, что он принят.
Вопрос
Это разрешено стандартом C (прежде всего C99 или C11, но C89 тоже будет)? Какой раздел? Или я просто ударил по корпусу с нечетным шаром, который работает на всех машинах, к которым он портирован, но официально не санкционирован стандартом?