C++ 如何使用c++;是否包含特定文件中的所有函数而不包含该文件?

C++ 如何使用c++;是否包含特定文件中的所有函数而不包含该文件?,c++,C++,我只是觉得奇怪这是怎么回事? 这是我第一次看到这个,两个C++文件位于同一个目录“Test1.CPP,Test2.CPP” Test1.cpp: #include <iostream> void magic(); int main(){ magic(); return 0; } #包括 无效魔法(); int main(){ 魔术(); 返回0; } Test2.cpp: #include <iostream> using namespace std; vo

我只是觉得奇怪这是怎么回事? 这是我第一次看到这个,两个C++文件位于同一个目录“Test1.CPP,Test2.CPP”

Test1.cpp:

#include <iostream>
void magic();
int main(){
    magic();
return 0;
}
#包括
无效魔法();
int main(){
魔术();
返回0;
}
Test2.cpp:

#include <iostream>

using namespace std;
void magic(){
    cout << "That's not a magic , it's a logical thing.." << endl;
}
#包括
使用名称空间std;
虚幻魔法{

CUT< P>为了从C++源代码中获得可执行文件,需要两个主要阶段:

  • 编写阶段
  • 连接阶段
第一种方法只搜索函数的签名,并检查函数调用是否与找到的声明兼容

第二种方法是在通过链接器的命令行指定的选项链接的库或对象中搜索函数的实现(一些编译器可以通过添加一些命令行选项自动运行链接器)


因此,为了理解这个过程,您需要了解编译器和链接器选项。

头文件的主要内容是简化代码编写

让我们考虑下一个例子:

test2.cpp

#include <iostream>

using namespace std;

void my ()
{ magic(); } // here we don't know what magic() is and compiler will complain

void magic(){
  cout << "That's not a magic , it's a logical thing.." << endl;
}

为了避免此错误,我们需要将
magic()
函数的声明放在
my()
的定义之前。因此最好将所有声明放在一个位置。头文件就是这样一个位置。如果不使用头文件,我们需要粘贴
magic()的声明
函数在任何cpp文件中使用。

您要查找的过程称为链接。链接通过外部链接标识名称,因此两个文件中的名称
magic
都指向链接中的同一实体。在链接中,所有名称都指向已定义的(而不是仅声明的)实体实体可用于创建可执行程序或库;
告诉编译器将有一个具有此签名的函数-稍后在同一文件中或在链接时-因此您将能够在代码中使用它..您可以使用
Test2.h
进行
magic
声明,但这已经在
Test1.cpp
中,并且在
Test1.cpp
中不需要它也不需要在<代码> TEST2.CPP<代码>中定义它。C++没有原型;相反,我们只说你声明了代码>魔法<代码>,或者说,Test1.CPP包含“声明>代码>魔法>代码>。在C语言中使用,它是一种不同的语言,具有不同的规则。C++在这方面比C更简单。;向复制者指出某个地方定义了一个函数魔术。这个依赖关系将在喜欢阶段得到解决。如果你想学究的话,你应该提到编译器本身不做链接。GNU工具链调用
ld
来做链接,但你也可以将对象文件打包成
ar
和完全避免使用
ld
。谢谢你,考虑到你的建议,我刚刚进行了编辑以改进响应。@Geroggaal,这是否意味着如果我删除了magic声明“void magic();”将是链接器错误?(缺少定义)?这不是链接器错误,而是编译器错误。我编辑了答案。请看具体的错误。哦,是的,但若我们在并没有定义的情况下声明它,这将是链接器错误,对吗?
gaal@linux-t420:~/Downloads> g++ test2.cpp 
test2.cpp: In function ‘void my()’:
test2.cpp:6:9: error: ‘magic’ was not declared in this scope
 { magic(); } // here we don't know what magic() is and compiler will complain
         ^