//my_struct.h
typedef struct my_struct_t *my_handle;
void f1(my_handle handle);
void f2(my_handle handle);
//my_struct.c
#include "my_struct.h"
typedef struct
{
int a;
int b;
} my_struct_t;
//Is this definition legal?
void f1(my_struct_t *handle)
{
//bla bla
}
//Is this definition legal?
void f2(const my_struct_t *handle)
{
//bla bla
}
//main.c
#include "my_struct.h"
void g1(my_handle handle)
{
//Is this call legal?
f1(handle);
//Is this call legal?
f2(handle);
}
在这种特定情况下,
my_handle
是struct my_struct_t *
的别名,所以我看不出为什么上面的代码应该是非法的。
GCC 不允许我编译这段代码,所以我猜这是非法的。
ISO c99 标准对此有何规定?
f1
不行,甚至不应该编译。 my_struct_t
是 typedef 名称,而不是结构名称。出于同样简单的原因,f2
也不行。
如果您将源代码中的结构定义更改为
struct my_struct_t { ... };
并将函数定义(而不是声明)更改为采用 struct my_struct_t
那么 f1
可以编译并正常工作,但 f2
仍然无法编译,因为定义与声明不匹配。
如果您没有让源文件看到标头,那么可能不会出现编译或链接错误,但代码的行为将是未定义的,因为在声明之间会违反“单一定义规则”
f2
(一个对 main.c 可见,另一个对 my_struct.c 可见)。