8

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

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

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

编辑:

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

4

8 回答 8

6

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

wtf.cpp:

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

天哪.cpp:

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

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

输出:f();

于 2013-05-17T09:47:39.453 回答
3

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

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

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

于 2013-05-17T08:51:57.817 回答
3

该功能就像该翻译单元中可用的其他功能一样。但是您仍然可以从任何地方访问它,因为它只有外部链接。所以就这样做:

void foo()
{
    extern void sort();

    sort();
}
于 2013-05-17T08:57:43.890 回答
2

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

于 2013-05-17T08:52:31.473 回答
1

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

于 2013-05-17T08:51:46.237 回答
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
   ....
}
于 2013-05-17T08:59:30.620 回答
1

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

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

请参阅C 中的静态函数,尤其是@Stephen_Canon 的答案

于 2013-07-24T16:40:43.333 回答
1

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

于 2017-11-03T13:29:56.203 回答