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

C中的预编译宏定义

这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理....整个预处理语句之后只能有空白符或者注释, 不能有其它内容. 2, name代表宏名称, 它可带参数....insert ( a=1, b=2;)  就有问题了: 预处理器会提示出错: 函数宏的参数个数不匹配. 预处理器把","视为参数间的分隔符.  ...这里的"相同"要求先后定义中空白符出现的位置相同, 但具体的空白符类型或数量可不同, 比如原先的空格可替换为多个其他类型的空白符: 可为tab, 注释....使用这些条件编译命令可以方便地实现对源代码内容的控制. else之后不带常量表达式, 但若包含了常量表达式, gcc只是给出警告信息.

2.9K40

宏工作原理以及典型面试10问

注释仅供程序员理解代码,注释对机器没有用。因此预处理器在预处理过程中会删除注释,因为注释在执行过程中是不需要的,也不会被执行。所以注释尽管写不影响程序的逻辑,当然写的过也未必是好事,过少也不是好事。...个人理解一份好的代码应尽量少注释,应该通过合理的命名习惯,良好的编程风格来提高可读性,在一些关键复杂算法处则应清晰的加上注释。...C语言中使用#include,这是预处理器的指令,告诉预处理器包含指定文件的内容。例如#include将告诉预处理器将stdio.h中所有的内容包含进来。...宏有两种常见形式: 大致说明了宏的工作原理,来看看一些常见的面试问题: 不带参形式(有的地方也称对象形式object-like)。...本文总结了宏的基本工作原理,以及10个比较典型的面试问题,相信对于宏理解不深的盆友会有些许帮助。 如喜欢请点赞/在看/分享支持!

60710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    预处理机制

    宏替换 预处理器根据宏定义将代码中的宏名称替换为指定的文本。 可以是常量替换,也可以是带参数的宏函数替换 预处理器会根据宏定义展开宏 条件编译 根据条件选择性地编译不同的代码块。...宏展开和条件编译的递归处理 在进行宏展开和条件编译时,如果遇到新的预处理指令,预处理器会递归地处理这些指令。肯呢个会触发更多的宏展开和条件编译。...删除注释 预处理器将源代码中的注释删除,注释在预处理阶段无需保留,不会影响编译器的输出。...这些指令在预处理时发出特定的错误或警告信息,让开发者知道代码中存在的问题或需要注意的地方 #error和#warning指令生成的信息只会在预处理阶段发出,而不会影响到最终的目标代码,它们在编译阶段不会生成任何错误或警告信息...善用条件编译:在庞大工程代码的配置裁剪工作中,绝大多数的技术手段就是利用条件编译,对不同的代码选用和删除,达到代码裁剪的效果。

    13810

    这该死的 C 语言!

    void 表明 main() 不带任何参数。...gcc -o hello hello.c gcc 编译器驱动从源文件读取 hello.c ,并把它翻译成一个可执行文件 hello。...对于程序员来说,你无需为了编写高质量的代码而去理解编译器内部做了什么工作。然而,为了编写出高效的 C 语言程序,我们需要了解一些基本的机器码以及编译器将不同的 C 语句转化为机器代码的过程。...注释 在程序中,使用 /**/ 的表示注释,注释对于程序来说没有什么实际用处,但是对程序员来说却非常有用,它能够帮助我们理解程序,也能够让他人看懂你写的程序,我们在开发工作中,都非常反感不写注释的人,由此可见注释非常重要...default : 开关语句中的其他分支 返回语句 retur:子程序返回语句(可以带参数,也看不带参数) 存储类型关键字 auto : 声明自动变量 一般不使用 extern : 声明变量是在其他文件正声明

    51120

    C语言进阶-程序环境和预处理

    宏定义计算弊端 #define 替换规则 #和## #的作用 ## 的作用 带副作用的宏参数 宏和函数对比 宏和函数优劣表 宏和函数命名约定 #undef 命令行定义 条件编译 条件编译类型 文件包含...示例:printf函数需要的库 翻译阶段详解 预编译 该阶段执行内容:  头文件的展开(#include)  宏替换(#define)  条件编译的处理(#if #endif等)  去注释(/...__DATE__    //文件被编译的日期 __TIME__    //文件被编译的时间 __STDC__    //如果编译器遵循ANSI C,其值为1,否则未定义(gcc有定义,vs没有) //...(a):(b)) 对于函数执行该任务: 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多 函数的参数必须声明为特定的类型(参数类型局限),而宏可以适用于整形、长整型、浮点型等可以用于...#endif //常量表达式由预处理器求值 示例:作注释符 多个分支的条件编译 #if defined(symbol) #ifdef symbol #if !

    66050

    【C语言篇】编译和链接以及预处理介绍(上篇)

    在 gcc 环境下想观察⼀下,对 test.c ⽂件预处理后的.i⽂件,命令如下: gcc -E test.c -o test.i 预处理阶段主要处理那些源⽂件中#开始的预编译指令。...这个过程是递归进⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。 删除所有的注释 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。 或保留所有的#pragma的编译器指令,编译器后续会使⽤。...编译过程的命令如下: gcc -S test.i -o test.s 对下⾯代码进⾏编译的时候,会怎么做呢?...__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义 在gcc上举例: int main() { printf...二者在执行核心运算指令差不多,但函数多了调用准备工作和返回的指令 更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型合适的表达式上使⽤。

    12310

    这篇文章不知道起什么名字

    ,把C变量的名称作为汇编语言中的注释 这个可以一次编译许多的中间文件 -save-temps:自动输出预编译处理文件、汇编文件、对象文件,编译正常进行 –help:显示gcc帮助说明 -target-help...:显示目标机器特定的命令行选项 –version:显示gcc版本号和版权信息 -E:只进行预处理,不编译 -S:只编译,不汇编 -c:只编译、汇编,不链接 -pipe:使用管道代替临时文件 -combine...调试使用的信息 -fverbose-asm:在编译成汇编语言时,把C变量的名称作为汇编语言中的注释 -save-temps:自动输出预编译处理文件、汇编文件、对象文件,编译正常进行 -fsyntax-only...-O0:关闭所有优化选项 -O1:第一级别优化,使用此选项可使可执行文件更小,运行更快,并不会增加太多编译时间,可以简写为-O -O2:第二级别优化,采用了几乎所有优化技术,使用此选项会延长编译时间...生成的规则可以是单行,但如果太长,就用’/’换行符连续成多行。规则显示在标准输出,不产生预处理过的C程序 -C:告诉预处理器不要丢弃注释。

    74030

    程序员C语言快速上手——进阶篇(七)

    进阶语法 模块化编程 多个源文件 使用头文件 关于头文件的总结 预处理 预处理概述 文件包含 宏定义 条件编译 预处理的高级使用 普通宏 带参的宏 条件编译 其他预处理指令 进阶语法 模块化编程 所谓模块化开发...实际上两者的区别仅仅是参照物的区别,更简单的说就是路径的区别,和是不是标准库头文件或自定义头文件没有关联。这一点很重要,特别是在自己编写或修改开源库构建脚本,编译大型C语言工程时。...或""来包含头文件都可以 验证,将#include "calculate.h" 改为#include ,使用命令编译 1 gcc t1.c t2.c main.c -ID:...预处理 所谓预处理,就是在办正事之前做一点准备工作。预处理指令都是以#号开头的,这一点很好辨认。...使用注释符号注释代码时,有一个缺点,注释无法嵌套,即不能注释中间包含注释的代码,使用条件编译则很方便 其他预处理指令 #error 指令 可以用于检查某些编译器属性,当不符合时,提示错误,并终止编译。

    1.3K60

    【Linux】--- Linux编译器-gccg++、调试器-gdb、项目自动化构建工具-makeMakefile 使用

    编译(生成汇编): 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把c语言代码翻译成汇编语言。...最初的计算机只能处理二进制,二进制是处理器的“母语”。这叫“机器语言”或者“机器码”。...在计算机早期阶段,必须用机器码写程序(即二进制编程)(前段时间很火的《三体1》中,早期叶文洁当时就是使用的二进制编程,还用到了打孔带,上面记录的就是二进制信息)。...那为什么不直接将c语言转为二进制目标文件呢?因为前人已经写好了汇编的编译器,我们只需站在巨人的肩膀上,再将高级语言转为较简单的汇编代码即可。 那么如何形成第一个汇编写的汇编编译器呢?...3.2 原理 make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么, make会在当前目录下找名字叫"Makefile"或"makefile"的文件。

    43320

    Linux:常用软件、工具和周边知识介绍

    这里二者用法几乎一样,我举例子用gcc举例 格式: gcc [选项] 要编译的文件 [选项] [目标文件] 常用的选项: -E: 只激活预处理,不生成文件,需要将其重定向到一个输出文件中。...-w: 不生成任何警告信息 3.2编译过程 编译过程通常包括以下四个阶段: 预处理(Preprocessing): 在这个阶段,预处理器将源代码中的预处理指令(如宏替换、条件编译等)处理成适合编译器进一步处理的形式...预处理器的工作包括文件包含(#include)、宏替换(#define)、条件编译(#ifdef、#ifndef等)等。...所谓的头文件展开,本质是在预处理的时候,将头文件内容拷贝至源文件 预处理器处理后的文件通常具有更大的体积,并且不包含注释和空行。...编译器的工作包括词法分析、语法分析、语义分析、优化等。 编译器输出的结果是以汇编语言表示的中间代码。

    27110

    【Linux操作系统】自动化编译make和Makefile

    Linux环境下开发,工程源文件较少时,可使用gcc直接编译;但当工程源文件较多时,gcc直接编译复杂(比如命令较多,文件的编译先后顺序确定问题等)且不易于后期项目的维护,因此采用make/makefile...ps: makefile文件名也可叫:Makefile makefile文件中注释用“#” test:test.c #依赖关系 gcc test.c -o test #依赖方法...@在命令行执行make的时候,会将所执行的命令回显到终端,带@则不回显 为什么在命令行执行的时候,执行第一组依赖关系和依赖方法的命令是make,执行第二组依赖关系和依赖方法的命令却是make clean...所以Modify更新,Change一定也会更新 但是Access/Change改变并不会造成另外两个时间也改变 回顾一下文件属性: Linux 文件或目录的属性主要包括:文件或目录的节点、种类...、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。

    86040

    【C语言基础】:编译和链接(计算机中的翻译官)

    这些指令允许程序员根据特定的条件来包含或排除代码块,从而为不同的编译环境定制源代码。 移除注释(Comment Removal): 预处理器会删除源代码中的注释,因为注释对于编译器来说是无意义的。...注释以//或/* … */开始,直到行尾或注释块的结束。...处理其他预处理指令: 预处理器还处理一些其他的指令,如#pragma,这些指令通常用于向编译器提供特定的、非标准的指令或请求。...源代码中的注释也已经被删除。 所以注释是给程序员们看的,而不是给编译器看的。...代码优化: 虽然主要的优化工作在编译阶段进行,但汇编器也可以执行一些简单的优化,比如消除冗余的指令或改善指令的顺序以提高执行效率。

    12710

    初识Linux · 有关gccg++

    当然了,有的时候我们写代码写了新特性,就会导致编译失败,我们多注意,或搜索升级一下g++ gcc就可以了。...2.1 预处理 结合C语言阶段的编译链接知识,我们知道预处理阶段是进行宏替换,头文件展开,去掉注释等工作的,还牵扯到了条件编译部分,那么我们想要看预处理阶段的代码怎么看呢?...中间的一大堆注释也不见了,可以判定为去掉注释成功了。...这里简单带一下条件编译的内容,主要用到指令 -D,测试代码为: 编译也是没有问题的,我们先来默认编译一下: 默认打印的是0,那么我们使用-D快捷定义一下: D和V1之间可以空格可以不空,这就是条件编译。...我们平常查看任务处理器的时候,不免的会发现很多.dll文件,或者是.lib文件,这实际上就是标准库,我们在安装编译器的时候,安装的不仅仅有头文件,还有该语言的标准库。

    11610

    c语言里面预处理的用法

    gcc就是一个编译工具链。上面第四个是最为详细的编译过程。...3、gcc中只预处理不编译的方法: gcc编译时可以给一些参数来做一些设置,譬如 gcc xx.c -o xx 可以指定可执行程序的名称;譬如 gcc xx.c -c -o xx.o 可以指定只编译不连接...gcc -E xx.c -o xx.i 可以实现只预处理不编译。...头文件包含的真实含义就是:在#include的那一行,将xx.h这个头文件的内容原地展开替换这一行#include语句。过程在预处理中进行。 (2)、注释: 注释是给人看的,不是给编译器看的。...编译器既然不看注释,那么编译时最好没有注释的。实际上在预处理阶段,预处理器会拿掉程序中所有的注释语句,到了编译器编译阶段程序中其实已经没有注释了。

    69310

    linux使用make编译_linux load

    例如: $ petalinux-package –image -c kernel –format uImage 注释: 该选项仅支持 Zynq-7000 器件和 MicroBlaze™ 处理器。...• 3 级: ○ 对于 MicroBlaze™ 处理器: 下载预建 FPGA 比特流并启动目标上的预建内核镜像 预建选项启动级别用途的示例: $ petalinux-boot –jtag –prebuilt...所用的 TCP 端口是 3121;确保该端口的防火墙被禁用 在工作站上运行 petalinux-boot 命令, 如下所示: $ petalinux-boot –jtag –prebuilt 3 TFTP...这是可选项 注释: 如果不希望 PetaLinux 构建 FSBL/FS-BOOT,则需要自己手动构建。否则, 系统将无法正常启动。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    39.8K20

    程序环境和预处理

    编译 选项 gcc -S test.c 编译完成之后就停下来,结果保存在test.s中。 把C语言代码翻译为汇编指令 3....预处理详解 3.1 预定义符号 __FILE__ __LINE__ __DATE__ __TIME__ __STDC__ //进行编译的源文件 //文件当前的行号 //文件被编译的日期 //文件被编译的时间...用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。 所以宏比函数在程序的规模和速度方面更胜一筹。  2. 更为重要的是函数的参数必须声明为特定的类型。...函数参数只在函数调用的时候求 值一次,它的结果值传递给函 数。表达式的求值结果更容易预 测。...: //linux 环境演示 gcc -D ARRAY_SIZE=10 programe.c 3.5 条件编译 在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的

    8410

    前端构建:Less入了个门

    显示定义不带参数和带参数的样式库(mixin库),不会输出到最终输出中,仅供调用; 7.3. mixin的中内置两个特殊的对象@arguments和@reset。...注释 // 单行注释,不会作为最终输出 /* 多行注释,以原生CSS的/*注释....*/形式作为最终输出 */   2....注意: 不带扩展名或带非.less的扩展名均被视为less文件; @import可出现在任何位置,而不像css的@import那样只能放在文件第一行。  ...@import (inline) "文件路径";   用于引入与less不兼容的css文件,通过inline配置告知编译器不对引入的文件进行编译处理,直接输出到最终输出。...显示定义不带参数和带参数的样式库(mixin库),不会输出到最终输出中,仅供调用;   Less源码: // 定义不带参数的mixin .animal(){   color: #000; } // 定义带参数的

    1.7K70

    Linux下如何编译CC++代码?从.c到.exe经历了什么?

    编译C语言指令: gcc + 文件名 如果不指定生成的 目标文件的文件名,默认生成的可执行文件的名字为 a.out 编译前: 编译后: 如何指定生成的 可执行文件的文件名呢?...) 文件名2: 带编译的源文件 (示例: hello.c) 指定生成的可执行文件的文件名: 编译c++代码: 首先如果没有安装g++命令,可以先安装一下。...“条件编译”完成: 只保留满足条件的语句 “宏”的替换: 宏只是简单的直接替换 “注释”去掉: 注释语句时给人看的,编译器才不关心!...4.2 “编译”阶段 前面我已经了解了预处理阶段的工作,那么下一步就是 “编译”了 -S选项:让gcc开始执行程序翻译,到编译结束后就停止。 为什么会报错呢?...* r * r; //计算圆的面积 //printf("注释的代码"); printf("圆的面积是 %.2f\n", area); return 0; } 编译阶段主要完成以下工作

    36010
    领券