我是C ++菜鸟。我有一个定义函数的foo.cpp文件,
void sort() {
// details of sort algorithm
}
我没有在相应的头文件中定义它,但是我没有编译错误。我注意到这被视为一种静态方法。是这样的吗?我到底在这做了什么?
编辑:
我注意到在这个方法中我不能使用它,(例如:this-> bar),因此我假设这是一个静态函数。这实际上发生在我想要一个'私有'方法时,但忘了在头文件中声明它。是否真的使用过这样的功能?
答案 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
,否则它不是静态的。
静态函数除了限制访问外,还可以允许编译器优化以获得更好的性能。
答案 7 :(得分:1)
如果在具有相同签名的其他cpp文件中定义相同的函数,也可能非常糟糕。