我正在修复一些代码的错误,编译器(合法地)警告说该函数dynscat()
没有被声明——其他人对可接受的编码标准的想法——所以我追踪了函数的定义位置(很容易)以及哪个头文件声明了它(没有; 咕噜!)。但我期待找到结构定义的细节对于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 也可以)?哪个板块?或者我只是碰到了一个奇怪的盒子,它可以在它移植到的所有机器上运行,但没有得到标准的正式批准?