【发布时间】:2020-11-10 03:13:32
【问题描述】:
我在 Visual Studio 中有一个简单的项目,使用 main.cpp、Log.cpp 和 Log.h。
main.cpp:
#include <iostream>
#include "Log.h"
int main()
{
Log("Hello World");
std::cin.get();
}
日志.cpp
#include <iostream>
#include "Log.h"
void Log(std::string message)
{
std::cout << message << std::endl;
}
void InitLog()
{
Log("Initialized Logger");
}
Log.h:
#pragma once
#include <string>
void Log(std::string);
void InitLog();
我知道#include 语句将所有包含文件的代码复制粘贴到写入它的文件中。我的问题是,当我运行它时,函数 Log 是如何按预期运行的?
我们包含来自 main.cpp 和 Log.cpp 的 Log.h 文件,但这只是函数声明。我们从来没有在 main.cpp 中包含 Log.cpp,那么 main.cpp 是如何获取 Log() 的函数体的呢?
【问题讨论】:
-
Visual Studio IDE 还是 Visual Studio Code 编辑器?
-
Visual Studio IDE
-
您只需将它们全部放入同一个构建项目中,它们应该会自动链接。
-
虽然 this question 是关于 C 的,但同样的基本原则也适用:这是链接器所扮演的角色之一。它在翻译单元被编译为目标文件后解析外部引用,将其全部转换为单个可执行文件。
-
从 C++ 风格的角度来看,这表明您应该有一个带有构造函数 (
Log::Log) 和某种log(const std::string& message)函数的Log类。注意const引用的使用。这样可以避免复制可能会变得昂贵但几乎总是浪费的价值。
标签: c++ compilation linker include