结构体前置声明引发的一个编译问题
遇到这么一个编译错误:
有三个文件
//a.h
typedef struct
int world;
}hello;
typedef struct hello * phello;
int func(phello para);
//a.c
#include "a.h"
int func(hello *b)
return 2 + (b->world);
//main.c
#include "a.h"
#include <stdio.h>
int main()
hello i;
i.world = 1;
printf("%d", func(&i));
}
这个代码编译时告警:标识符func类型冲突。
这段代码是真实代码脱敏后简化出来的,实际上hello类型的定义与hello的前置声明不在同一个文件中定义的。
尝试了几种写法,排除了下面两个问题:
1. func函数定义处入参b和声明处入参para入参名称不同 不会有任何影响;
2. hello *和phello入参类型名称不同 不会有任何影响。
那么问题出在哪儿呢?
我们看hello结构的定义。熟悉编码规范的同学应该知道,这是违反结构体风格的,但仅仅是一个风格问题吗?
分析一下这样定义意味着什么:它给
struct