我修错了一些代码并且编译器警告(合法地)该函数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, "$");
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
该代码已经在AIX,HP-UX,Solaris,Linux上进行了十年的编译,因此它不被GCC特定的接受.
这是C标准允许的(主要是C99或C11,但C89也会这样做)?哪个部分?或者我只是碰到了一个奇怪的球案,它适用于所有移植到它的机器,但是没有被标准正式批准?
您能否从三个C标准之一(最好是C99或C11)中给出章节和经文,它们表明以下头文件中是否有一种或两种struct uperms_entry类型?
#ifndef UPERMS_CACHE_INCLUDE
#define UPERMS_CACHE_INCLUDE
typedef struct mutex MT_MUTEX;
typedef struct uperms_cache
{
MT_MUTEX *cache_lock;
int processing;
struct uperms_entry *uperms_list; // No prior struct uperms_entry
} uperms_cache_t;
typedef struct uperms_entry // Does this define a different struct uperms_entry?
{
char username[32];
int perms;
struct uperms_entry *next;
} uperms_entry_t;
#endif /* UPERMS_CACHE_INCLUDE */
Run Code Online (Sandbox Code Playgroud)
附带问题:
(我认为答案是'是 - 严格来说有两种类型',然后(1)否和(2)否.)
上下文:内部代码审查 - 我希望结构的顺序颠倒过来,但我不确定我是否完全过于迂腐.
更新:
显然,最初问题的答案是"有一个struct uperms_entry",因此编号为1和2的问题没有实际意义.我很高兴我在检查代码之前检查了一下.
主要问题解决后很久就添加了此部分.
以下是ISO/IEC 9899:2011中广泛但相关的引用:
§6.2.7兼容型和复合型
1如果类型相同,则两种类型具有兼容类型.用于确定两种类型是否兼容的附加规则在6.7.2中描述了类型说明符,在6.7.3中描述了类型限定符,在6.7.6中描述了声明符.55)此外,如果它们的标签和成员满足以下要求,则在单独的翻译单元中声明的两个结构,联合或枚举类型是兼容的:如果使用标签声明一个,则另一个应使用相同的标签声明.如果两者都在其各自的翻译单元内的任何地方完成,则以下附加要求适用:其成员之间应存在一对一的对应关系,以便每对相应的成员被宣布为兼容类型; 如果使用对齐说明符声明该对中的一个成员,则使用等效的对齐说明符声明另一个成员; 如果该对的一个成员使用名称声明,则另一个成员使用相同的名称声明.对于两个结构,相应的成员应按相同的顺序声明.对于两个结构或联合,相应的位域应具有相同的宽度.对于两个枚举,相应的成员应具有相同的值.
55) …