如果我在实现(.cpp)文件中定义一个函数而没有在头文件中定义它会发生什么
if I define a function in the implementation (.cpp) file without defining it in the header file what happens?
我是一个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文件中定义相同的函数,则可能非常糟糕。
- C++无法定义虚拟函数 OUTER 类和头文件
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- C++编程从外部文本文件定义数组大小
- MAKE:找不到包含的用户定义的头文件?
- 定义C++新的环境变量并在 bat 文件中使用它
- 在头文件中定义变量不会出错
- 即使我没有包含多个文件,C++中的多个定义错误
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 将文件复制到自定义位置,存在字符串转换问题
- 如何正确定义C++类析构函数并将其链接到主文件?
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- 从头文件定义嵌套类
- 使用标头文件定义MT19937和normal_distribution
- 为特定文件定义
- 从.h和.cpp文件定义纯虚拟函数会产生链接器错误吗
- C 编程从外部输入文件定义数组大小
- 编译头文件定义了一个模板类,该类还包括其他头文件