对于代码:

int hi(int);
int hi();
int main()
{
    hi(3);
}

我没有得到任何编译错误(调用hi();不带参数会得到编译错误).

我以为编译器会抱怨该函数已经声明了不同的方式.你知道为什么会有这种行为吗?

推荐答案

您可以随意多次声明相同的符号,只要声明不相互冲突,就不会出现错误.

这是因为

int hi();

并不矛盾

int hi(int);

是因为一个没有任何参数的声明,意味着你说你真的不知道有多少个参数,或者它们是什么类型.这并不真的与第一个声明相矛盾.因为您已经声明了hi,所以编译器将简单地使用该声明.


正如在 comments 中指出的,这将随着C23标准的变化而改变.它采用了C++中没有显式参数表示void的语义,因此

int hi();

将相当于

int hi(void);

当然,这意味着这两个声明will相互矛盾.

C++相关问答推荐

如何在C中通过转换为char * 来访问float的字节表示?

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

SDL 2.0-从数组渲染纹理

我在这里正确地解释了C操作顺序吗?

C在声明带有值的数组时,声明大小有用吗?

Kdb:仅升级指定的列

是否可以通过调用两个函数来初始化2D数组?示例:ARRAY[STARTING_ROWS()][STARTING_COLUMNS()]

在进程之间重定向输出和输入流的问题

在C++中允许使用字符作为宏参数

GetText不适用于包含国际字符的帐户名称

如何逐位读取二进制文件?

如何在MSVC中使用intSafe.h函数?

挥发性语义的形式化理解

如何不断地用C读取文件?

gdb - 你能找到持有内部 glibc 锁的线程吗?

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

System V 消息队列由于某种原因定期重置

如何用用户输入的多个字符串填充数组?

是什么阻止编译器优化手写的 memcmp()?

如何在 C 中编辑 struct 体中的多个变量