函数原型与其定义略有不同是否合法?

问题描述 投票:0回答:1
//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 标准对此有何规定?

c c99 function-definition function-declaration function-prototypes
1个回答
0
投票

f1
不行,甚至不应该编译。
my_struct_t
是 typedef 名称,而不是结构名称。出于同样简单的原因,
f2
也不行。

如果您将源代码中的结构定义更改为

struct my_struct_t { ... };
并将函数定义(而不是声明)更改为采用
struct my_struct_t
那么
f1
可以编译并正常工作,但
f2
仍然无法编译,因为定义与声明不匹配。

如果您没有让源文件看到标头,那么可能不会出现编译或链接错误,但代码的行为将是未定义的,因为在声明之间会违反“单一定义规则”

f2
(一个对 main.c 可见,另一个对 my_struct.c 可见)。

© www.soinside.com 2019 - 2024. All rights reserved.