首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有办法阻止Boost.Build递归扫描#include指令的头文件?

在云计算领域,阻止Boost.Build递归扫描#include指令的头文件是一个常见的问题。为了解决这个问题,可以考虑以下方法:

  1. 使用预编译头文件(PCH):预编译头文件是一种在编译过程中预先编译好的头文件,可以减少编译时间并提高效率。在Visual Studio中,可以使用/Yu和/Yc选项来创建和使用预编译头文件。
  2. 使用编译器选项:可以使用编译器选项来控制头文件的搜索路径和优先级,以避免不必要的搜索。例如,在GCC中,可以使用-I选项来指定头文件搜索路径,-include选项来指定需要包含的头文件,以及-nostdinc选项来禁用标准头文件搜索路径。
  3. 使用构建系统:可以使用构建系统来控制头文件的依赖关系和编译过程。例如,在CMake中,可以使用target_include_directories和target_link_libraries来指定头文件和库文件的依赖关系,以及add_definitions和add_compile_options来指定编译选项。
  4. 使用第三方库:可以使用第三方库来减少头文件的依赖关系。例如,可以使用Boost库中的头文件,而不是自己编写头文件。

总之,阻止Boost.Build递归扫描#include指令的头文件需要综合考虑多种方法,以提高编译效率和减少不必要的依赖关系。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C语言】编译和链接(细节king)

前言 相信大家在学完C语言全部基础知识,肯定会经常动手敲代码。以VS为例,大家在使用IDE进行编译代码时,有没有想过编译过程中发生了什么?为什么一定要包含stdio.h这个头文件?...预处理阶段主要处理那些源文件中带有#开始预编译指令。比如#include、#define,处理规则如下: 将所有的 #define 删除,并展开所有的宏定义。...处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif 。 处理#include 预编译指令,将包含头文件内容插入到该预编译指令位置。...这个过程是递归进行,也就是说被包含头文件也可能包含其他文件。 删除所有的注释。(编译器处理是,用一个空格代替) 添加行号和文件名标识,方便后续编译器生成调试信息等。...或保留所有的#pragma编译器指令,编译器后续会使用。 经过预处理之后.i 文件里就不再包含宏定义,因为宏都已经被展开了。并且包含头文件内容都会插入到.i文件中。

8110
  • 预处理机制

    预处理类别 宏定义:#define 将文本替换为表达式或语句 条件编译:#ifdef、#ifndef和#if、#elif、#endif 根据标识符是否被定义选择编译代码 头文件包含:#include 将其他文件...(通常是头文件)包含到当前文件中,以便在当前文件中使用头文件中定义内容 预处理流程 预处理指令识别 宏替换 条件编译 头文件包含 行连接处理 宏展开和条件编译递归处理 预处理指令识别 扫描源代码并识别以...#ifdef、#ifndef和#if、#elif、#endif 头文件包含 通过#include指令,将其他文件(通常是头文件)包含到当前文件中,以便在当前文件中使用头文件中定义内容 预处理行连接处理...宏展开和条件编译递归处理 在进行宏展开和条件编译时,如果遇到新预处理指令,预处理器会递归地处理这些指令。肯呢个会触发更多宏展开和条件编译。...重点强调 宏定义命名规范 宏定义与函数调用冲突 #include不单单是只能包含头文件include本质就是纯文本包含。

    13010

    Objective-C中预处理器指令与宏

    我们再具体地说说包含哪些: 头文件包含(#include、#import) 条件编译(#if、#elif、#else、#endif、#ifdef和#ifndef) 诊断(#error、#warning和...预处理器指令 头文件包含 学C语言时候就接触到了#include,学java也会用到import(注意没有#号),都是用来导入头文件,这个作用我们明白,OC中导入头文件有#include和#import...两种指令,而且对于头文件名还分为双引号包含和尖括号包含两种方式: #include "头文件名" #include #import "头文件名" #import 问题来了...而对于#include和#import这两者,区别在于#import可以确保头文件只被引用一次,这样就可以防止递归包含,什么叫递归包含,A引用B和C,B也引用了C,那就都包含了C,这就重复包含了。...因此,如果非要用#include,那必须额外地写指令来判断有没有包含过,来避免递归包含。

    71030

    C语言预处理超详解

    替换文本随后被插入到程序中原来文本位置。对于宏,参数名被它们值所替换。 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义符号。如果是,就重复上述处理过程。...函数参数与类型有关,如果函数参数类型不同,就需要不同函数,及时它们完成任务是相同。 调试 宏是不方便调试 函数是可以逐语句调试 递归 宏是不能递归 函数可以递归 7....头文件包含 12. 1 头文件被包含方式: 12. 1. 1 本地文件包含 #include "filename" 查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在...另外,在比较新VS版本中,标准头文件不是都存放在这个文件夹中了,如果想要找到它们,有两种办法: 在VS编译器代码中包含这个头文件,#include然后按住 ctrl ,点击头文件名...就像它实际出现于 #include 指令地方一样。 这种替换方式很简单:预处理器先删除这条指令,并用包含文件内容替换。

    9610

    C语言进阶(十五) - 预处理与程序编译初步解析

    最后,再次对结果文件进行扫描,看看它们是否包含任何由#define定义符号。如果是,重复上述处理过程。 注意: 宏参数和#define定义中可以出现其它#define定义符号。...,只要对参数操作是合法,它就可以使用于任何参数类型 函数参数是与类型有关,如果参数类型不同,就需要不同函数,即使它们执行任务是不同 调试 宏不方便调试 函数可以逐语句调试 递归 宏不能递归...函数可以递归 1.2.7 命名约定 函数和宏使用语法相似,语言本身没有办法帮助我们进行区分。...就像这个文件实际出现于#include指令地方一样。 替换方式:预处理器先删除这条指令,并用包含文件内容替换。 那么如果一个源文件被包含多次,那么实际就被编译多次。...本地文件包含#include "filename.h" 查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在**标准位置(库目录)**查找头文件

    43320

    为什么C语言会有头文件

    那么问题来了,import后面的模块名称一般是相关类和对象声明和实现模块,而include后面只能跟一个头文件,只有声明。...其实这个认识是错误,C语言并没有规定include只能包含头文件include本质是一个预处理指令它主要工作是将它后面的相关文件整个拷贝并替换这个include语句,比如下面一个例子 //add.cpp...C/C++编译时候先扫描整个文件有没有语法错误,然后将C语句转化为汇编,当碰到不认识变量、类、函数、对象命名时,首先查找它有没有声明,如果没有声明直接报错,如果有,则根据对应定义空出一定存储空间并进行相关指令转化...:比如给变量赋值时会转化为mov指令并将、调用函数时会使用call指令。...编译完成之后进行链接,首先扫描所有的obj文件,先查找main函数,然后根据main函数中代码执行流程来一一组织代码结构,当碰到之前保留符号时,去所有的obj中符号表中根据变量符号查找对应地址,

    2.2K50

    C语言从入门到实战——预处理详解

    C语言预处理工作原理如下: 预处理器扫描源文件,遇到以#开头指令时,按照指令要求进行处理。 对于宏替换指令,预处理器将标识符替换成对应代码或表达式。...调试 宏是不方便调试 函数是可以逐语句调试 递归 宏是不能递归 函数是可以递归 七、 #和## 7.1 #运算符 #运算符将宏一个参数转换为字符串字面量。...12.1 头文件被包含方式: 12.1.1 本地文件包含 #include "filename" 查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件...12.2 嵌套文件包含 我们已经知道, #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令地方一样。...下面是一些常见 #pragma 指令用法: #pragma once:用于确保头文件只被包含一次,可以在头文件开头使用该指令

    51111

    宏(预编译)详解

    递 归 宏是不能递归 函数是可以递归 3.2.6宏命名约定和#undef指令 一、命名约定: 一般来说,函数与宏使用语法很相似,所以语言本身没办法帮我们区分二者...3.4文件包含 我们不论写C语言还是写C++语言,我们都会用到头文件,像等,其实,#include指令可以使另外一个文件被编译。...就像他实际出现于#include指令地方一样。 这种替换方式很简单: 预处理器先删除这条指令,并用包含文件内容替换。...1)本地文件包含: #include"filename" 查找方式: 先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件。...2)Linux环境标准头文件路径: 为/usr/include 3)库文件包含: #include 查找方法: 查找头文件直接去标准路径下去查找

    21910

    编译和链接

    比如:#include,#define,处理规则如下: 将所有的 #define 删除,并展开所有的宏定义。  ...处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif 。  处理#include 预编译指令,将包含头文件内容插⼊到该预编译指令位置。...这个过程是递归进行,也就是说被包含头文件也可能包含其他文件。 删除所有的注释 添加行号和文件名标识,方便后续编译器生成调试信息等。  或保留所有的#pragma编译器指令,编译器后续会使用。...经过预处理后 .i 文件中不再包含宏定义,因为宏已经被展开。并且包含头文件都被插入到.i文件中。所以当我们无法知道宏定义或者头文件是否包含正确时候,可以查看预处理后 .i 文件来确认。...1.2.1 词法分析         将源代码程序被输入扫描器,扫描任务就是简单进行词法分析,把代码中字符分割成一系列 记号(关键字、标识符、字面量、特殊字符等)。

    8710

    编译——链接

    例如:#include ,#define处理规则如下: 将所有的 #include 删除,并展开所有的宏定义 处理所有的文件编译指令,如: #if 、#ifdef、#elif、#else、#end if...处理所有的#include 预编译指令,将包含头文件内容插入到该预编译指令位置。...这个过程是递归进行,也就是说被包含头文件也可能包含其他文件 删除所有注释 添加行号和文件名标识,方便后续编译器生成调试信息 或保留所有的#pragma 编译器指令,编译器后续会使用 经过预处理后 ....包含头文件也被插入到 .i文件中。所以我们无法知道宏定义或者头文件包含是包含正确时,可以查看预处理之和 .i文件来确认。...,进行编译时,会怎么做呢: array[index] = (index+4)*(2+6);   词法分析:         将源代码程序输入扫描器,扫描任务就是简单进行词法分析,将代码中字符分割成一系列记号

    5110

    【程序编译和预处理】源文件到可执行程序到底经历了什么?

    ---- 目录 1.程序翻译环境&2.执行环境 3.详解:程序编译和链接(翻译环境) 4.预处理符号详解 4-1内置预处理符号  5.预处理指令 5-1#define定义符号 5-2#define...#和##宏妙用 6-1#  6-2## 6-3带有副作用宏参数 7.宏和函数对比(蓝色标明考虑角度) 8.条件编译 9.预处理指令#include 10.面试题:宏实现offsetof ----...(函数参数是带计算拷贝) 如果宏中有多份++就会执行多次 7.宏和函数对比(蓝色标明考虑角度) 宏没有函数栈帧开销,也没有了函数递归; 宏只是简单替换,没了类型检查,也产生了优先级和副作用,...宏是没有办法调试 宏在使用不当,可能会带来运算符优先级和++副作用问题 宏是没办法递归 8.条件编译 应用:stdio.h头文件中好多这种东西,你要看得懂 #define NUM 1...ct.h"写成#include 推荐: 引用自己定义头文件使用""" 引用库里头文件使用  9-2防止头文件被重复包含两种方法:(写在头文件) 多次包含了头文件危害

    30530

    VS2010下编译配置Boost_1.53

    其中PREFIX是为Boost.Build指定安装目录,生成编译工具将会存放在该目录下。我指定为c:\boost_1_53 把PREFIX/bin路径加入到系统环境变量。...在VS2010中,工具>>选项>>项目和解决方案>>VC++目录这个功能已经被取消了,没办法看到全局VC++目录设置。所以,我们只好在项目的属性中设置。这样稍显麻烦。...这样,在包含头文件时候,编译器会报错找不到头文件。因为写成这样,会把\boost这个路径给去掉了。而头文件内部依赖很多其他头文件又是相对于\boost这个路径。编译无疑无法通过。...三、测试结果 10、编译boost库自带一个源程序: 1 #include 2 #include 3 #include ...> 7 #include 8 #include 9 #include

    1.3K90

    【C语言】程序编译、预处理

    r); return 0; } 这就是整体有没有括号差别的!!!...调 试 宏是不方便调试 函数是可以逐语句调试 递 归 宏是不能递归 函数是可以递归 命名约定 :一般来讲函数使用语法很相似。所以语言本身没法帮我们区分二者。...就像它实际出现于 #include 指令地方一样。 这种替换方式很简单:预处理器先删除这条指令,并用包含文件内容替换。...这样一个源文件被包含10次,那就实际被编译10次 头文件被包含方式: 1.本地文件包含 #include "filename" 查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件...2.库文件包含 #include 查找头文件直接去标准路径下去查找,如果找不到就提示编译错误。这样是不是可以说,对于库文件也可以使用 “” 形式包含?

    26520

    编译和链接

    比如#include,#define,处理规则如下: 将所有的 #define 删除,并展开所有的宏定义。...处理所有的条件编译指令,如:#if、#ifdef、#elif、#else、#endif 。 处理#include 预编译指令,将包含头文件内容插入到该预编译指令位置。...这个过程是递归进行,也就是说被包含头文件也可能包含其他文件。 删除所有的注释 添加行号和文件名标识,方便后续编译器生成调试信息等。...或保留所有的#pragma编译器指令,编译器后续会使用。 经过预处理后 .i 文件中不再包含宏定义,因为宏已经被展开。并且包含头文件都被插入到 .i文件中。...假设有下面的代码 array[index] = (index+4)*(2+6); 1.2.1 词法分析 将源代码程序被输入扫描器,扫描任务就是简单进行词法分析,把代码中字符分割成一系列记号(关键字

    7210

    【程序编译(预处理操作)+链接】

    最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义符号。如果是,就重复上述处理过程。 注意: 宏参数和#define定义中可以出现其他#define定义符号。...函数参数是与类型有关,如果参数类型不同,就需要不同函数,即使他们执行任务是不同。 调试 宏是不方便调试。 函数是可以逐语句调试递归 宏是不能递归。 函数是可以递归。...3.5 文件包含 我们已经知道,#include指令可以使另外一个文件被编译。就像它实际出现于#include指令地方一样。 这种替换方式很简单: 预处理器先删除这条指令,并用包含文件内容替换。...3.6.1 头文件被包含方式: 本地文件包含 #include"filename" 查找策略: 先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件。...这样最终程序中就会出现两份comm.h内容。这样就造成了文件内容重复。 那么解决这个问题办法是什么? 用条件编译。

    54900

    “ Hello world ”中秘密之【C语言程序编译和链接】

    ⽐如:#include,#define,处理规则如下: • 将所有的 #define 删除,并展开所有的宏定义。...• 处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif 。 • 处理#include 预编译指令,将包含头文件内容插入到该预编译指令位置。...这个过程是递归进行,也就是说被包含头文件也可能包含其他文件。 • 删除所有的注释 • 添加行号和文件名标识,方便后续编译器⽣成调试信息等。...词法分析 将源代码程序被输⼊扫描器,扫描任务就是简单进⾏词法分析,把代码中字符分割成⼀系列记号(关键字、标识符、字⾯量、特殊字符等)。...通过 lex程序可以做到快速扫描词法,帮助开发者不需要为每个编译器开发相应词法扫描器。 语法分析 在进行完词法分析后,会生成相应记号,然后对记号进行语法分析,从而产生语法树。

    14710

    C语言详解(编译和链接)

    (支持程序运行基本函数集合)或者第三方案 1.1 预处理(预编译) 在预处理阶段,源文件和头文件会被处理成.i为后缀文件 预处理阶段主要处理那些源文件中#开始预编译指令。...比如:#include、#define,处理规则如下: 将所有的#define删除,并展开所有的宏定义 处理所有的条件编译指令,如:#if、#ifdef、#elif、#else、#endif 处理#include...预编译指令,将包含头文件内容插入到该预编译指令位置,这个过程是递归进行,也就是说被包含头文件也可能包含其他文件 删除所有的注释 添加行号和文件名标识,方便后续编译器生成调试信息等 保留所有的#...pragma编译器指令,编译器后续会使用 经过预处理后.i文件中不再包含宏定义,因为宏已经被展开,并且包含头文件都被插入到.i文件中,所以当我们无法知道宏定义或者头文件是否包含正确时候,可以查看与处理后...将源代码程序输入扫描器,扫描任务就是简单进行词法分析,把代码中字符分割成一系列记号(关键字、标识符、字面量、特殊字符等)。

    6410

    【C语言】预处理

    这个问题,解决办法是在宏定义表达式两边加上⼀对括号就可以了。...头文件包含 12.1 头文件被包含方式: 12.1.1 本地文件包含 #include "filename" 查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件⼀样在标准位置查找头文件...Linux环境标准头文件路径: /usr/include VS环境标准头文件路径: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC...答案是肯定,可以,但是这样做查找效率就低些,当然这样也不容易区分是库文件还是本地文件了。 12.2 嵌套文件包含 我们已经知道, #include 指令可以使另外⼀个文件被编译。...就像它实际出现于 #include 指令地方一样。 这种替换方式很简单:预处理器先删除这条指令,并用包含文件内容替换。

    8310
    领券