结构体前置声明引发的一个编译问题

遇到这么一个编译错误:

有三个文件

//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