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

时间:2013-05-17 08:50:28

标签: c++ function

我是C ++菜鸟。我有一个定义函数的foo.cpp文件,

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

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

编辑:

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

8 个答案:

答案 0 :(得分:3)

该功能与该翻译单元中提供的其他功能类似。 但你仍然可以从任何地方访问它,因为它只有外部链接。所以这样做:

void foo()
{
    extern void sort();

    sort();
}

答案 1 :(得分:3)

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

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();

答案 2 :(得分:2)

不,它不被视为静态功能。它只是不可见其他的转换unnits,所以你不能使用它。

静态方法的不同之处在于链接器看到了函数。因此,如果在另一个转换单元中定义具有相同名称的函数,则可能会出现链接器错误(最佳情况)或者有时会调用错误的方法。

PS:我在这里谈论函数而不是方法,因为在C ++中,方法通常是类的一部分,并且您无法为类定义方法如果该方法未在该类的声明中声明。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

你刚刚定义了一个免费功能。

您可以在您的实现文件中使用,因为声明高于调用(解析器从上到下“读取”源文件):

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
   ....
}

答案 6 :(得分:1)

即使它只在实现文件中,除非你指定static,否则它不是静态的。

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

请参阅static function in C,特别是@Stephen_Canon's answer

答案 7 :(得分:1)

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