gpt4 book ai didi

c - 多个相同的原型(prototype)是否合法?

转载 作者:行者123 更新时间:2023-12-01 12:29:02 25 4
gpt4 key购买 nike

Linux x64 上使用 gccclang 编译时,以下代码不会发出任何警告:

#include <stdio.h>
#include <stdlib.h>

void foo(void);

void foo(void);

void foo(void);

int main(void)
{
return 0;
}

IMO,根据以下来自 C99 的片段,这是合法的:

All declarations that refer to the same object or function shall have compatible type; otherwise, the behavior is undefined.

(...)

For two function types to be compatible, both shall specify compatible return types

(...)

Moreover, the parameter type lists, if both are present, shall agree in the number of parameters and in use of the ellipsis terminator; corresponding parameters shall have compatible types.

(...)

Two types have compatible type if their types are the same.

我说的对吗?我想确定它不是 UB 并且我的理解是正确的。

最佳答案

多个相同的原型(prototype)是合法的,而且实际上很常见,因为在现代 C 中,函数定义通常包含该函数的原型(prototype),并且在作用域中也包含函数的原型(prototype)头文件。即给定

foo.h:

void foo(int x);

foo.c:

#include "foo.h"

void foo(int x) {
printf("%d\n", x);
}

/* ... */

foo() 在函数 foo 定义的主体范围内和整个文件的其余部分中有两个相同的原型(prototype)。这很好。

相同的同一对象或函数的多个声明也是可以的,只要它们兼容即可。例如,声明

void foo();

foo 声明为一个接受未指定参数且不返回任何内容的函数。此声明与 foo.cfoo.h 中已有的声明兼容,并且可以将其添加到其中一个或两个文件中,附加效果为零。

这也适用于对象(变量),其中一些应用非常普遍。例如,如果要声明一个从多个文件访问的全局变量,那么通常将该变量的声明放在头文件中。包含该变量定义的 C 源文件——这也是一个声明——通常是 #include header ,产生两个声明:

global.h:

extern int global;

global.c:

#include "global.h"

int global = 42;

或者有复合数据类型前向声明的情况:

struct one;

struct two {
struct one *my_one;
struct two *next;
};

struct one {
struct two *my_two;
}

请注意 struct one 的多个兼容但不完全相同的声明。如果没有多次声明其中一种类型,则根本无法声明这组特定的数据结构。

关于c - 多个相同的原型(prototype)是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36317534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com