精华内容
下载资源
问答
  • 编译器和预处理器

    2013-04-09 08:36:14
    编译器 就是把源代码翻译成目标代码的工具,目标代码可以是机器码,也可以是其他代码 预处理器 就是在代码交给编译器处理前,预先进行一些处理,比如包含头文件,宏展开等等

    编译器

    就是把源代码翻译成目标代码的工具,目标代码可以是机器码,也可以是其他代码


    预处理器

    就是在代码交给编译器处理前,预先进行一些处理,比如包含头文件,宏展开等等

    展开全文
  • 预处理器定义了用于调试的名字: __FILE__//存放文件名的字符串字面量 __LINE__//存放当前行号的整型字面值 __TIME__//存放文件编译时间的字符串字面值 __DATE__//存放文件编译日期的字符串字面值 ...

    编译器为每个函数定义了__func__来显示函数的名字
    预处理器定义了用于调试的名字:

    __FILE__//存放文件名的字符串字面量
    
    __LINE__//存放当前行号的整型字面值
    
    __TIME__//存放文件编译时间的字符串字面值
    
    __DATE__//存放文件编译日期的字符串字面值
    

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 预处理器编译器,汇编器,连接器的概念区别

    千次阅读 多人点赞 2019-02-14 16:14:21
    好记性不如烂笔头,所以准备详细的记录一下这几个东西的功能区别,有例子为证。 参考博客:https://www.cnblogs.com/hutao886/p/5614296.html hello程序的生命周期是从一个源程序(hello.c)(称为高级c语言)...

    好记性不如烂笔头,所以准备详细的记录一下这几个东西的功能和区别,有例子为证。

    参考博客:https://www.cnblogs.com/hutao886/p/5614296.html

    hello程序的生命周期是从一个源程序(hello.c)(称为高级c语言)开始,被其它程序转化为一系列的低级机器语言指令,这些指令按照一种称为可执行目标程序的格式打包好,以二进制磁盘文件的形式保存。

      例:unix> gcc -o hello hello.c可以实现源文件向目标文件的转化,该过程由编译程序完成。

      hello.c  ---->hello.i  ---->hello.s  ---->hello.o  -->hello

    拿一个简单的例子,例子叫做Base.c,内容如下:

    #include <stdio.h>
    
    /*这是一条注释*/
    int main(){
      printf("Hello world\n");
      return 0;
    }

    (1).预处理(cpp):预处理器不止一种,而C/C++的预处理器就是其中最低端的一种——词法预处理器,主要是进行文本替换、宏展开、删除注释这类简单工作。

    • gcc -E 选项可以得到预处理后的结果,扩展名为.i;
    • C/C++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于C/C++语句(这也是定义宏时不要加分号的原因),语法检查是编译器要做的事情;
    • 预处理之后,得到的仅仅是真正的源代码;
    • GCC确实很强大,如果是用VC这种IDE,恐怕就不能看到预处理后的结果。

        e.g. 所谓预处理,就是把程序中的宏展开,把头文件的内容展开包含进来,预处理不会生成文件,所以需要重定向

    (2).编译器(ccl):将文本文件.i翻译成文本文件.s,得到汇编语言程序(把高级语言翻译为机器语言),该种语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。

    • gcc -S 选项可以得到编译后的汇编代码,扩展名为.s;
    • 汇编语言为不同高级语言的不同编译器提供了通用的输出语言,比如,C编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。

    e.g.

    (3).汇编(as):将.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件.o中(把汇编语言翻译成机器语言的过程)。

    • gcc -c 选项可以得到汇编后的结果,扩展名为.o;
    • .o是一个二进制文件,它的字节编码是机器语言指令而不是字符。如果在文本编辑器中打开.o文件,看到的将是一堆乱码。
    • 把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

    e.g.

    (4).链接(ld):gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去。 函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。

    展开全文
  • 编译器代替预处理器Reference 1. 被声明为explicit的构造函数 声明为explicit的构造函数禁止编译器执行非预期(往往不被期望的)的类型转换,可以阻止隐式类型转换,但允许显式类型转换(强制类型转换)。 鼓励...

    1. 被声明为explicit的构造函数

    声明为explicit的构造函数禁止编译器执行非预期(往往不被期望的)的类型转换,可以阻止隐式类型转换,但允许显式类型转换(强制类型转换)。
    鼓励使用这一声明,除非你有一个好的理由允许构造函数进行隐式类型转换。

    2. 拷贝构造

    Pass-by-value也是通过调用拷贝构造函数

    class Widget{
    public:
    	Widget(){}//缺省构造函数
    	Widget(const Widget& rhs);//拷贝构造函数
    	Widget& operator=(const Widget& rhs);//拷贝操作符
    	hasAccQuality(Widget w);
    }
    ...
    Widget w1;//调用缺省构造函数
    Widget w2(w1);//调用拷贝构造函数
    w1 = w2;//调用拷贝操作符
    Widget w3 = w2;//调用拷贝构造函数
    if(w3.hasAccQuality(w2))//调用拷贝构造函数
    ...
    

    3. 命名习惯

    1. lhs:left hand side
    2. rhs:right hand side
    3. pt:pointer to T,指向T类型对象的指针
    4. rt:reference to T,T类型对象的引用

    4. 多线程问题

    C++对多线程问题需要额外注意,线程安全是一个不容忽视的问题。

    5. C++联邦

    C++是一个联邦,同时支持过程形式,面向对象形式,函数形式,泛型形式、元编程形式;C、Object-Oriented C++、Template C++、STL是需要好好学习的四个方面。

    6. 用编译器代替预处理器

    Prefer const, enum and inline to #define!!!
    #define 的记号不会进入记号表里面,但出现错误时,难以追踪。

    #define CircleRadius 1.68543   
    const double CircleRadius = 1.68543; //更好
    

    指向常量的常量指针

    const std::string sAuthorName("Jack-lct"); //std::string 比char*-base字符串更好
    const char* const pAuthorName = "Jack-lct"; 
    

    class 专属常量,头文件声明+实现文件定义,无法使用 #define

    class A{
    ...
    static const int ANumber ;//头文件中声明
    ...
    }
    ...
    const int A::ANumber = 10;//实现文件中定义
    

    无法使用 in class初值设定,使用enum hack技术

    class GamePlayer{
    ...
    private:
    	enum{NumberTurn =5};
    	int scores[NumberTurn];
    }
    

    使用 template inline 函数

    #define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b)) //不好,会有潜在问题
    
    template <typename T>
    inline void callWithMax(const T& a, const T& b){
    	f(a>b?a:b);
    } //好
    

    Reference

    [1] Scott Meyers. 电子工业出版社. Effective C++中文版[M]. 2006.

    展开全文
  • 编译器替换预处理器(以const,enum,inline替换#define): #define不被视为语言的一部分,那正是他的问题所在。 sam1: #define ASPECT_RATIO 1.534 替换为: Const double AspectRatio=1.534; 名称记号ASPECT_...
  • ★ C/C++预处理器什么都不会做,只是做宏替换文本替换。 ★ C/C++预处理是不会做任何语法检查的,不仅是因为它不具备语法检查功能,也因为预处理命令  不属于C/C++语句(这也是定义宏时不要加分号的...
  • 记号名称ASPECT_RATIO在被编译器识别之前,已经被预编译器替换为1.653了,所以名称ASPECT_RATIO有可能没进入记号表内。 解决方法:  const double AspectRatio = 1.653; 性能影响:  对...
  • Keil使用的C编译器支持常用的编译器预定义宏对文件...首先,我们了解一下何为预定义宏和预处理器以及他们起什么作用 预定义宏:ARM编译器预定义了很多宏,这些宏提供了工具链版本号和编译器选项的相关信息。 预处...
  • 此条款也可以改为:“宁可以编译器替换预处理器”。 假设有一个宏: #define ASPECT_RATIO 1.653当我们运用这个常量但获得一个编译错误信息时,错误信息可能会提到1.653而不是ASPECT_RATIO,如果ASPECT_RATIO被定义...
  • 用于高科技C编译器v3.09的新C预处理器 介绍 当我从Hi-Tech C编译器软件包v3.09开始反编译预处理器时,我发现错误消息与John F. Reiser {John F. Reiser}编写的程序消息完全相同。 因此,我假设Hi-Tech C预处理程序...
  • const char*const authorName = "Scott Meyers";
  • 预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。 我们...
  • 取消预处理器定义 只有两种语言:人们抱怨的语言没人使用的语言-Bjarne Stroustrup 我喜欢那句话。 它解释了JavaScriptHaskell。 通过这种方式,预处理器是一种很棒的语言,因为人们经常使用它。 从来没有将它...
  • 预处理器,他的作用就像名字...当然预处理器不只可以这些事,vc编译器提供了大量的预处理指令,提供包括编译命令行,隐式链接等功能. 看看维基百科对于预处理器的解释吧: In computer science, a preprocessor is a p
  • CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行CSS的编码工作。 转化成通俗易懂的话来说就是...
  • LuaMacro - Lua 的宏预处理器 这是一个用于预处理评估 Lua 代码的库驱动程序脚本。 可以定义词法宏,它可以是简单的 C 预处理器样式的宏或根据上下文改变其扩展的宏。 它是项目的一个新的重写版本,它需要 Luiz...
  • Surelog SystemVerilog 2017预处理器,解析器,UHDM编译器。 提供IEEE Design / TB VPI和... 使用Google Flatbuffers将预处理器和解析器AST持久化在磁盘上,从而实现增量编译。 该工具内置线程安全功能,并执行多线
  • 详解C/C++预处理器

    千次阅读 2018-05-31 15:46:04
    预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进行处理的程序。预处理器指令以#号开头标识,末尾不包含分号。预处理命令不是C/C++语言本身的组成部分,不能直接对它们进行编译链接。C/C++语言的一...
  • 预处理器定义宏

    千次阅读 2018-08-25 07:50:56
    预处理器定义宏 宏(C/C++) 预处理在非预处理指令的所有行(即第一个非空白字符不是 # 的行)中展开宏,并在指令的某些部分(没有作为条件编译的一部分跳过)中展开宏。利用“条件编译”指令,您可以通过测试一个...
  • 预处理器指令

    千次阅读 2019-04-12 16:39:34
    预处理器指令指导编译器在实际编译开始之前对信息进行预处理。 所有的预处理器指令都是以 # 开始。且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号(;)结束。 C# ...
  • C语言预处理器

    2021-01-06 10:13:16
    C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,379
精华内容 21,751
关键字:

编译器和预处理器