首页
学习
活动
专区
工具
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指令的头文件需要综合考虑多种方法,以提高编译效率和减少不必要的依赖关系。

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

相关·内容

预处理机制

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

12410
  • 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,那必须额外地写指令来判断有没有包含过,来避免递归包含。

    69630

    C语言预处理超详解

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

    2300

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

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

    42620

    为什么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:用于确保头文件只被包含一次,可以在头文件开头使用该指令

    44611

    宏(预编译)详解

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

    19510

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

    ---- 目录 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防止头文件被重复包含两种方法:(写在头文件) 多次包含了头文件危害

    29930

    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 查找头文件直接去标准路径下去查找,如果找不到就提示编译错误。这样是不是可以说,对于库文件也可以使用 “” 形式包含?

    25020

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

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

    54500

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

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

    13810

    C语言翻译环境:预编译+编译+汇编+链接详解

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

    37910

    C语言编译和链接超详解

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

    2800

    宏替换、条件编译、头文件展开

    宏替换、文件编译和头文件展开 程序执行几个步骤: 1.预处理: ①将头文件展开 ②宏替换 ③条件编译 ④去掉注释 2.编译: ①语义语法纠错 ②将.c文件编译成汇编语言 3.汇编:将汇编语言变成二进制机器语言...对于宏,参数名被他们值所替代。 ③最后,再次对文本结果进行扫描,看看是否包含了任何由#define定义符号。如果是就重复上述处理过程。...这样,宏定义参数和#define定义可以包含其他#define定义符号。但是,宏不可以出现递归。...①#include指令使另外一个文件被编译:预处理器先删除这条指令,并用包含文件内容替换。...③文件开头写:#pragma once 可以避免头文件重复引入。 以上总结,有不足和有误地方还望指出!

    2.2K20

    【C语言】编译和链接

    预处理 在预处理阶段,源文件和头文件都会被处理成为.i为后缀文件 预处理阶段主要处理源文件中#开始预编译指令,规则如下: ①将所有的#define删除,并展开所有的宏定义 ②处理所有的条件编译指令...③处理 #include 预编译指令,将包含头文件内容插入到该预编译指令位置。...这个过程是递归进行,因为包含头文件可能包含其他文件 ④删除所有的注释 ⑤添加行号和文件名标识,方便后续编译器生成调试信息 ⑥保留所有的 #pragma 编译器指令,后续编译器会使用 经过预处理后...词法分析 源代码程序会被输入扫描器,在扫描器中被简单词法分析,把代码中字符分割开 arr[input] = (input+2)*(5-2); 这个代码是一个数组赋值代码,我们进行词法分析时候会将它们全部拆开...,这个阶段会报告错误语法信息 3、汇编 然后接下来一步是进入汇编器,将汇编指令转换为机器可执行指令,根据汇编指令和机器指令对照表一一翻译,不做指令优化 4、链接 然后就是链接,链接就是把一堆文件链接在一起生成可执行程序

    7910

    编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)

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

    18010
    领券