C和C++中的函数声明

Hap*_*tal 7 c++ declaration function

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

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

//file2.cpp
void fun(double);
int main()
{
   fun(5);
}  
Run Code Online (Sandbox Code Playgroud)

当我编译它们并将它们作为c ++文件链接时,我收到错误"undefined reference to fun(double)".
但当我这样做C文件时,我没有得到错误,而是打印0而不是5.
请解释原因.
此外,我想问一下在定义函数之前是否需要声明一个函数,因为
我没有在file1.cpp中声明它,但编译时没有错误.

Sco*_*les 6

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

另一方面,C++会破坏程序集名称,所以你会得到类似_fun@intfor fun(int)_fun@doublefor的东西fun(double),以便重载工作.链接器将看到它们具有不同的名称并喷出一个无法找到其定义的错误fun(double).

对于第二个问题,声明函数原型总是一个好主意,通常在头文件中完成,特别是如果函数在多个文件中使用.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);
}
Run Code Online (Sandbox Code Playgroud)

然后,您的程序中不会有多个冲突的原型.

  • IEEE-754 double 5.0的十六进制表示形式为0x4014000000000000.如果您的系统是x86之类的小端,那么从堆栈中读取前四个字节将为0,然后打印出来. (3认同)

Tho*_*nan 5

这是因为C++允许您重载函数而C不允许.在C++中使用它是有效的:

double fun(int i);
double fun(double i);
...
double fun(int i) { return 1;}
double fun(double i) { return 2.1; }
Run Code Online (Sandbox Code Playgroud)

但不是在C.

您无法使用C++编译器编译它的原因是因为C++编译器将声明视为double并尝试为其找到定义.使用C编译器,你也应该得到一个错误,我认为你没有完全按照你在用C编译器测试时所说的那样输入代码.

要点:C++有函数重载,C没有.