gpt4 book ai didi

c++ - C 和 C++ 中的函数声明

转载 作者:可可西里 更新时间:2023-11-01 18:27:43 27 4
gpt4 key购买 nike

我有两个 C++ 文件,比如 file1.cpp 和 file2.cpp

//file1.cpp  
#include<cstdio>
void fun(int i)
{
printf("%d\n",i);
}

//file2.cpp
void fun(double);
int main()
{
fun(5);
}

当我编译它们并将它们链接为 C++ 文件时,我收到错误“对 fun(double) 的 undefined reference ”。
但是当我以 C 文件的形式执行此操作时,我没有收到错误消息,打印的是 0 而不是 5。
请说明原因。 此外我想问一下我们是否需要在定义函数之前声明它,因为
我没有在 file1.cpp 中声明它,但编译没有错误。

最佳答案

这很可能是因为函数重载。当使用 C 编译时,对 fun(double) 的调用被转换为对汇编函数 _fun 的调用,后者将在稍后阶段被链接。实际定义还有程序集名称 _fun,即使它采用 int 而不是 double,并且链接器会在调用 fun(double) 时愉快地使用它。

另一方面,C++ 会破坏程序集名称,因此对于 fun(int)_fun@double<,您将得到类似于 _fun@int 的名称 用于 fun(double),以便重载工作。链接器将看到它们具有不同的名称并抛出一个错误,它找不到 fun(double) 的定义。

对于你的第二个问题,声明函数原型(prototype)总是一个好主意,通常在标题中完成,尤其是当函数在多个文件中使用时。在你的编译器中应该有一个缺少原型(prototype)的警告选项,gcc 使用 -Wmissing-prototypes。如果像这样设置你的代码会更好

// file1.hpp
#ifndef FILE1_HPP
#define FILE1_HPP
void fun(int)
#endif

// file1.c
#include "file1.hpp"
...

// file2.c
#include "file1.hpp"
int main()
{
fun(5);
}

这样您的程序中就不会有多个相互冲突的原型(prototype)。

关于c++ - C 和 C++ 中的函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2763193/

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