如果我在实现(.cpp)文件中定义一个函数而没有在头文件中定义它会发生什么

if I define a function in the implementation (.cpp) file without defining it in the header file what happens?

本文关键字:文件 定义 什么 cpp 实现 如果 函数 一个      更新时间:2023-10-16

我是一个c++新手。我有一个foo。cpp文件,它定义了一个函数

void sort() {
   // details of sort algorithm
}

我没有在相应的头文件中定义这个,但是我没有得到编译错误。我注意到这是一个静态方法。是这样吗?我到底做了什么?

编辑:

我注意到在这个方法中我不能使用这个,(例如:this->bar),因此我假设这是一个静态函数。这实际上发生在我想要一个"私有"方法,但忘记在头文件中声明它的时候。这样的函数有实际用途吗?

它在编译单元之外不是不可见的,它不绑定到单个编译单元,它只是一个需要声明才能被调用的定义。和其他定义一样

wtf.cpp:

#include <iostream>
void f(){ std::cout<< "f();"; }

omg.cpp:

void f(); // I can declare wherever I use it.
int main(){ f(); }

$ g++ wtf.cpp omg.cpp && ./a.out

输出:f();

不,不作为静态函数。它只是对其他翻译单元不可见,因此您不能使用它。

与静态方法的区别在于,链接器看到的是函数。因此,如果您在另一个翻译单元中定义具有相同名称的函数,您可能会得到链接器错误(最好的情况)或有时调用错误的方法。

PS:我在这里讨论的是函数而不是方法,因为在c++中方法通常是类的一部分,如果没有在类的声明中声明该方法,则不能为类定义方法。

什么也没发生。函数将在那里并且基本上可用,但如果没有原型/前向声明,其他翻译单元/部分代码将不知道它实际上在那里(并且基于优化级别,它可能被排除在结果可执行代码之外)。

该函数与该翻译单元中可用的其他函数一样。但是你仍然可以从任何地方访问它因为它有外部链接。所以只要这样做:

void foo()
{
    extern void sort();
    sort();
}

您已经创建了一个仅对该编译单元(以及包括源代码本身的其他单元)可见的函数。

您刚刚定义了一个自由函数。

你可以在你的实现文件中使用上面的声明调用(解析器从上到下"读取"源文件):

void fun(){
   mysort(); // Compile Error
void mysort(){}
void anotherFun(){
   mysort(); // Works here
   }

要摆脱这种边界效应,可以在文件的开头添加函数的原型。我经常在小的转换宏中使用这个"自由函数"。

示例:

char* BigEndianToLitteEndian( char word[], int size); // prototype
void routine()
{
  ....
  le = BigEndianToLittleEndian( be, SIZE );
  ....
}
char* BigEndianToLitteEndian( char word[], int size){ // implementation
   ....
}

尽管它只在实现文件中,但它不是静态的,除非您指定static

静态函数除了限制访问之外,还可以允许编译器优化以获得更好的性能。

查看C中的静态函数,特别是@Stephen_Canon的答案

如果在其他具有相同签名的cpp文件中定义相同的函数,则可能非常糟糕。