{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/source-header-file-processing/",
  "atlas": "https://www.pystone.net/?node=source-header-file-processing#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/source-header-file-processing.md",
  "context": "https://www.pystone.net/notes/source-header-file-processing.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:source-header-file-processing",
  "slug": "source-header-file-processing",
  "title": "源文件与头文件的处理",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "源文件与头文件的处理",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "a4533f15344782a4176e2da8b7d8290dd6da1d1bdcb9ec8dc89470ee9b07c79b",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "源文件与头文件的处理",
      "anchor": "源文件与头文件的处理",
      "citation": "https://www.pystone.net/notes/source-header-file-processing/#%E6%BA%90%E6%96%87%E4%BB%B6%E4%B8%8E%E5%A4%B4%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%84%E7%90%86"
    },
    {
      "depth": 2,
      "text": "头文件",
      "anchor": "头文件",
      "citation": "https://www.pystone.net/notes/source-header-file-processing/#%E5%A4%B4%E6%96%87%E4%BB%B6"
    },
    {
      "depth": 3,
      "text": "处理方式",
      "anchor": "处理方式",
      "citation": "https://www.pystone.net/notes/source-header-file-processing/#%E5%A4%84%E7%90%86%E6%96%B9%E5%BC%8F"
    },
    {
      "depth": 2,
      "text": "源文件",
      "anchor": "源文件",
      "citation": "https://www.pystone.net/notes/source-header-file-processing/#%E6%BA%90%E6%96%87%E4%BB%B6"
    },
    {
      "depth": 3,
      "text": "处理方式",
      "anchor": "处理方式-1",
      "citation": "https://www.pystone.net/notes/source-header-file-processing/#%E5%A4%84%E7%90%86%E6%96%B9%E5%BC%8F-1"
    },
    {
      "depth": 2,
      "text": "CMake处理方式",
      "anchor": "cmake处理方式",
      "citation": "https://www.pystone.net/notes/source-header-file-processing/#cmake%E5%A4%84%E7%90%86%E6%96%B9%E5%BC%8F"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:programming-languages-and-runtimes",
      "title": "编程语言与运行时",
      "url": "https://www.pystone.net/notes/programming-languages-and-runtimes/",
      "atlas": "https://www.pystone.net/?node=programming-languages-and-runtimes#knowledge-atlas",
      "label": "编程语言与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "本层中的“源文件与头文件的处理”导航项",
      "citation": "https://www.pystone.net/notes/programming-languages-and-runtimes/#%E6%9C%AC%E5%B1%82"
    },
    {
      "id": "note:c-project-build-makefile-cmake",
      "title": "C语言项目构建（Makefile与CMake）",
      "url": "https://www.pystone.net/notes/c-project-build-makefile-cmake/",
      "atlas": "https://www.pystone.net/?node=c-project-build-makefile-cmake#knowledge-atlas",
      "label": "C语言项目构建（Makefile与CMake）",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "头文件与源文件的处理中的“源文件与头文件的处理”导航项",
      "citation": "https://www.pystone.net/notes/c-project-build-makefile-cmake/#%E5%A4%B4%E6%96%87%E4%BB%B6%E4%B8%8E%E6%BA%90%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%84%E7%90%86"
    }
  ],
  "contentMarkdown": "# 源文件与头文件的处理\n\n﻿# 源文件与头文件的处理\n\n源文件（通常为 `.cpp` 或 `.c` 文件）和头文件（通常为 `.h` 或 `.hpp` 文件）\n\n\n## 头文件\n头文件主要用于声明：\n- **函数原型**：声明函数的名称、参数类型及返回类型。\n- **类定义**：声明类及其成员函数、成员变量。\n- **宏定义**：定义常量、宏或包含一些编译时条件。\n头文件通常不会包含实现细节，而是为源文件提供接口。这意味着头文件只会在被包含在某个源文件中时才参与编译。\n\n### **处理方式**\n- **包含（Include）机制**：当一个源文件使用 `#include \"header_file.h\"` 时，编译器将直接将头文件的内容插入到源文件的包含位置。这种处理方式使得头文件的内容能够在多个源文件中共享，而无需重复定义。\n- **编译过程**：头文件本身不会被单独编译。编译器在处理源文件时，通过 `#include` 指令将头文件的内容包含进来，然后将包含后的源文件编译成目标文件（`.o` 或 `.obj` 文件）。\n- **管理方法**：在 CMake 中，头文件的路径通常通过 `include_directories()` 来管理，这样编译器在处理源文件时能找到正确的头文件。例如：\n\n```cmake\ninclude_directories(${CMAKE_SOURCE_DIR}/include)\n```\n\n## 源文件\n源文件包含实际的实现代码，即函数和类的定义。它们是项目中实际被编译的单元，每个源文件在编译后生成一个目标文件（`.o` 或 `.obj` 文件），然后这些目标文件会被链接成最终的可执行文件或库。\n\n### **处理方式**\n- **编译**：每个源文件都会独立编译成一个目标文件。编译器会解析源文件的内容，并根据包含的头文件信息生成机器代码。\n- **链接**：编译生成的所有目标文件会被链接器链接成最终的二进制文件。这一步会解析和绑定所有的外部引用（例如其他源文件中定义的函数和变量）。\n- **管理方法**：在 CMake 中，源文件通常通过变量（如 `SOURCES`）来管理。您可以手动指定文件，也可以使用 `file(GLOB ...)` 自动查找文件。例如：\n\n```cmake\nfile(GLOB SOURCES \"src/*.cpp\")\nadd_executable(MyExecutable ${SOURCES})\n```\n\n\n## CMake处理方式\n- **头文件管理**：通过 `include_directories()` 指定头文件所在的目录，使编译器能够找到头文件。头文件目录的配置通常是全局的，适用于整个项目。\n\n- **源文件管理**：通过 `add_executable()` 或 `add_library()` 将源文件添加到构建目标中。CMake 处理源文件列表，并确保它们被编译和链接。\n\n编译过程:\n- **预处理**：编译器处理所有的 `#include` 指令，将头文件的内容插入到源文件中。\n- **编译**：编译器将处理过的源文件转换为目标文件。\n- **链接**：链接器将所有目标文件及依赖的库文件链接成一个可执行文件或库。\n"
}
