首页
学习
活动
专区
工具
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文件中。

8810
  • 预处理机制

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

    13810

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

    72330

    C语言预处理超详解

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

    10310

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

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

    44020

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

    60711

    宏(预编译)详解

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

    25910

    计算机的翻译(编译和链接)过程

    ●在预处理(预编译)阶段,源文件(.c)和头文件(.h)会被处理成后缀为 .i 的文件。 ●在gcc环境下,源文件被处理成.i文件,指令如下: 1.将所以得#define删除,并展开所以得宏定义。...2.处理所以的条件编译指令,如:#if、#ifdef、#elif、#else、#endif。 3.处理#include预编译指令,将包含头文件的内容插到预编译指令的位置。...该过程是递归进行的,也就是说头文件中还有可能包含其他头文件。 上面的删除宏定义,处理条件指令,处理#include预编译指令,都是和#相关的,所以上面三条都是把#处理掉。...包含的头文件也插到 .i 文件中。所以我们无法确定宏定义和头文件是否包含正确的时候,我们可以查看.i 文件进行判断。...假设有下面的代码: array[index] = (index+4)*(2+6); 词法分析: 将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成⼀系列的记号(关键字

    12110

    编译和链接

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

    9010

    编译——链接

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

    5510

    编译和连接

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

    5710

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

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

    30830

    【C语言】编译与链接

    c.处理#include 预编译指令,将包含的头文件的内容(有关函数的定义、声明等)插入到该预编译指令的位置,并删除#include。...这个过程是递归进行的,也就是说被包含的头文件也可能包含其他文件,如果包含,则将其他文件的内容也插入该自身预编译指令在头文件中的位置。...c.处理#include 预编译指令,将包含的头文件的内容(有关函数的定义、声明等)插入到该预编译指令的位置,并删除#include。...这个过程是递归进行的,也就是说被包含的头文件也可能包含其他文件,如果包含,则将其他文件的内容也插入该自身预编译指令在头文件中的位置。...2.3.1 词法分析: 将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成⼀系列的记号(关键字、标识符、字面量、特殊字符等)。那么这具体是什么意思呢?

    8410

    程序环境和预处理

    包括: 注释的删除 头文件的包含 #include头文件的包含 #define符号的替换 文本操作(所有的预处理指令都在预处理之后) 2....这个问题,的解决办法是在宏定义表达式两边加上一对括号就可以了。...就像它实际出现于 #include 指令的地方一样。 这种替换的方式很简单: 预处理器先删除这条指令,并用包含文件的内容替换。 这样一个源文件被包含10次,那就实际被编译10次。...3.6.1 头文件被包含的方式: 本地文件包含 #include "filename" 查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件...Linux环境的标准头文件的路径: /usr/include VS环境的标准头文件的路径: C:\Program Files (x86)\Microsoft Visual Studio 12.0

    8410

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

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

    28220

    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

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

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

    55700
    领券