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

计算机预处理详解

#define MAX 100;//定义标识符的时候加上了一个分号,正常的语句下,连续使用两个分号,编译器认为后面那个是一个空语句,但是在下面的场景会出现问题: if(condition)...max = MAX; else max = 0; if语句不加括号,默认只会跟着一条语句,这里相当于是有两条语句了,下面再出现else的时候就会出现语法错误。...所以比函数程序的规模和速度方面更胜一筹。 与类型无关。 当然,相比函数也有缺点 每次使用的时候,一份定义的代码插入到程序。除非比较短,否则可能大幅度增加程序的长度。...3、参数的替换是不经过计算的,有可能带有副作用,所以我们体的时候一般能加括号的地方都不要吝啬括号,但有时候这也不能解决副作用的问题。函数传参时传的是值,不会产生副作用。...6、函数调用时会产生时间和空间上的开销;调用时则没有,因为进行的只是简单的字符串替换。 7、如果使用比较多,展开时会产生大量的代码,大大降低运行时间。

6200

C语言中的定义

一种常见的错误定义中使用 = : #define N = 100 /*** WRONG ***/ int a[N]; /* 会成为 int a[= 100]; */ 在上面的例子,我们(错误地)...一个定义,编译器可以检测到绝大多数由多余符号所导致的错误。但不幸的是,编译器会将每一处使用这个的地方标为错误,而不会直接找到错误的根源——定义本身,因为定义已经被预处理器删除了。...当作为常量使用时,C程序员习惯名字使用大写字母。但是并没有如何将用于其他目的的宏大写的统一做法。由于(特别是带参数的)可能是程序错误的来源,所以一些程序员更喜欢使用大写字母来引起注意。...这些参数可以替换列表根据需要出现任意次。 的名字和左括号之间必须没有空格。如果有空格,预处理器认为是定义一个简单的,其中(x1,x2,…,xn)是替换列表的一部分。...(i+1*10); 由于乘法的优先级比加法高,这条语句等价于 j = i+10; 当然,我们希望的是 j = (i+1)*10; 定义缺少圆括号导致C语言中最让人讨厌的错误

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

C语言定义(#define定义常量​、#define定义​、 带有副作用的参数、 替换的规则、 函数的对比)

一、#define的基本语法 C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程,其值不能被改变的量。常量常使用#define来定义。...这里会出现语法错误。 四、#define定义 #define 机制包括了一个规定,允许把参数替换到文本,这种实现通常称为(macro)或定义define macro)。​...定义上加上两个括号,这个问题便轻松的解决了: #define SQUARE(x) (x) * (x) 这样预处理之后就产生了预期的效果: printf ("%d\n",(a + 1) * (...a + 1) ); 这里还有一个定义: #define DOUBLE(x) (x) + (x) 定义我们使用括号,想避免之前的问题,但是这个可能会出现新的错误。...#define DOUBLE( x) ( ( x ) + ( x ) ) 提示: 所以用于对数值表达式进行求值的定义都应该用这种方式加上括号,避免使用时由于参数的操作符或邻近操作符之间不可预料的相互作用

24910

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

当需要获取当前文件的路径和文件名时,可以使用这个常量。 进行编译的源文件使用 FILE 返回当前源文件的路径和文件名。...定义上加上两个括号,这个问题便轻松的解决了 #define SQUARE(x) (x) * (x) 这样预处理之后就产生了预期的效果: printf ("%d\n",(a + 1) * (a + 1...) ); 这里还有一个定义: #define DOUBLE(x) (x) + (x) 定义我们使用括号,想避免之前的问题,但是这个可能会出现新的错误。...#define DOUBLE( x) ( ( x ) + ( x ) ) 提示: 所以用于对数值表达式进行求值的定义都应该用这种方式加上括号,避免使用时由于参数的操作符或邻近操作符之间不可预料的相互作用...,除非加上括号,否则临近操作符的优先级可能产生不可预料的后果,所以建议书写的时候多些括号

22511

避免这7个误区,才能让【】削铁如泥

*(1)) 定义不必带有括号,通过主体编写不平衡的开放括号,可以创建一个从主体内部开始但在主体外部结束的调用。...s %d", p, 35) 组合调用的功能可能很有用,但是主体中使用不平衡的开放括号只会造成混淆,应该避免。...运算符优先级问题 大多数定义示例,每次出现的参数名称都带有括号,并且另一对括号通常会包围整个定义,这是编写最好的方式。...x_ : y_; }) “({{…})”符号产生一个复合表达式,它的值是其最后一条语句的值。 如果不使用GNU C扩展,唯一的解决方案是使用min时要小心。...在这种情况下,该问题可以通过使用相同的括号轻松解决,该括号应用于防止算术运算的错误嵌套: #define foo (a,b) or #define bar(x) lose((x)) 多余的一对括号可防止

1.2K20

Objective-C的预处理器指令与

#endif 一般都用在条件判断语句内容,后面都跟着双引号带着的消息,error指令直接中止编译,抛出错误消息,warning也抛出警告消息,但不会中止编译。...发生错误后,抛出说"文件名"文件的第11行有错误。后面跟着的文件名是一个可选项,写了就可以消息显示,不写也没关系。...定义函数的时候,有一个细节要注意,就是要多对参数使用括号: #defind SQUARE(x) ((x) * (x)) 为什么要这么麻烦?为什么不能直接 x * x?...,所以都应该使用括号。...此外,如果你的代码有多行,还应该使用括号括起来: #define FUNC(a, b) {a = a + b; b = a - b;} 此外,不要过度使用

67230

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

定义上加上两个括号,这个问题便轻松的解决了: #define SQUARE(x) (x) * (x) 这样预处理之后就产生了预期的效果: printf("%d\n",(a + 1) * (a + 1...) ); 这里还有一个定义: #define DOUBLE(x) (x)+(x) 定义我们使用括号,想避免之前的问题,但是这个可能会出现新的错误。...#define DOUBLE(x) ( (x) + (x) ) 即所有用于对数值表达式进行求值的定义都应该用这种方式加上括号,避免使用时由于参数的操作符或邻近操作符之间不可预料的相互作用。...,否则邻近操作符的优先级可能产生不可预料的后果,所以建议书写的时候多些括号。...函数参数只函数调用的时候求值一次,它的结果值传递给函数,表达式的求值结果更容易预测。 带有副作用的参数 参数可能被替换到体的多个位置,所以带有副作用的参数求值可能产生不可预料的后果。

52800

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

这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存的变量程序的整个执行过程一直保留他们的值。 终止程序。...错误,由替换产生的表达式并没有按照预想的次序进行求值 //a = 5+1*5+1 = 11 //定义上加上两个括号,这个问题便轻松的解决了: return 0; } #define...所以用于对数值表达式进行求值的定义都应该用这种方式加上括号,避免使用时由于参数的操作符或邻近操作符之间不可预料的相互作用 #define 替换规则 程序扩展#define定义符号和时,需要涉及几个步骤...符 优 先 级 参数的求值是在所有周围表达式的上下文环境里, 除非加上括号,否则邻近操作符的优先级可能产生 不可预料的后果,所以建议书写的时候多些括 号。...带 有 副 作 用 的 参 数 参数可能被替换到的多个位置,所以带有副作 用的参数求值可能产生不可预料的结果。 函数参数只传参的时候求值一 次,结果更容易控制。

20320

【C进阶】——预处理详解

如何解决,那也很简单: 定义上加上两个括号,这个问题便轻松的解决了: #define SQUARE(x) (x) * (x) 这样预处理之后就产生了预期的效果: printf ("%d\n"...#define DOUBLE( x ) ((x) + (x)) 所以我们得出结论: 用于对数值表达式进行求值的定义都应该用这种方式加上括号,避免使用时由于参数的操作符或邻近操作符之间不可预料的相互作用...所以: 尽量不要使用带有副作用的参数,以避免产生一些不可预料的结果。 5....这个其实我们的时候就演示过了,使用的时候,有些地方如果我们不加括号,可能就会导致由替换产生的表达式因为操作符优先级的问题而并没有按照我们预想的次序进行求值。...如果还找不到就提示编译错误。 10.1.2 库文件包含 #include 对于C标准库里的头文件,我们使用括号来包含。

13410

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

为了避免类似的错误,定义时,参数应该加上括号本身也应该加上括号。...可能带来运算符优先级的问题,导致程序出现错误。 ** 属性** #define定义 函数 代码长度 每次使用时,宏代码都会插入程序。...除了非常小的外,程序的长度大幅增长 函数代码只出现在一个地方,每次使用这个函数时,都调用那个地方的同一份代码 执行速度 更快 存在函数的调用和返回的额外开销,相对慢一些 操作符优先级 参数的求值是在所有周围的上下文环境...,除非加上括号,否则邻近操作符的优先级可能产生不可预料的后果,所以的书写时尽量多加些括号 函数参数只函数调用的时候求值一次,他的结果值传递给函数。...表达式的求值结果更容易预测 带有副作用的参数 参数可能被替换到的多个位置,所以带有副作用的参数求值可能产生不可预测的结果 函数参数只传参的时候求值一次,结果更容易控制 参数类型 的参数与类型无关

40720

简述C语言定义的使用

1 概述 工程规模较小,不是很复杂,与硬件结合紧密,要求移植性的时候,可采用定义简化编程,增强程序可读性。 当作为常量使用时,C程序员习惯名字使用大写字母。...由于(特别是带参数的)可能是程序错误的来源,所以一些程序员更喜欢使用大写字母来引起注意。...";" 使用#define来为常量命名一些优点: 程序更易读。...名采用大写字符组成的单词或其缩写序列,并在各单词之间使用“_”分隔。 如果需要公布某个,那么该定义应当放置头文件,否则放置实现文件(.cpp)的顶部。...不要使用来定义新类型名,应该使用typedef,否则容易造成错误。 给添加注释时请使用块注释(/* */),而不要使用行注释。因为有些编译器可能会把后面的行注释理解为体的一部分。

1.6K20

【C语言笔记】带参定义(二)

带参我们的嵌入式编程中使用得非常多,其定义如下: define 标识符(参数列表) 字符序列 其中参数列表的参数之间用逗号分隔,字符序列应包含参数表的参数。...定义带参数的时,名标识符与左圆括号之间不允许有空白符,应紧接在一起,否则变成了无参数的定义。 并且,字符序列与其每一个参数必须用括号扩起来,否则该定义可能产生二义性 。...这就是因为我们不给字符序列参数加括号的原因,产生了歧义。程序生成可执行程序之前的预处理过程把SQUARE(x+2)替换成了x+2*x+2,因此当x=5时res的结果为17。...和使用函数相比,使用的不利之处在于每次使用时,一份定义代码的拷贝都会插入到程序。除非非常短,否则使用大幅度增加程序的长度。 还有一些任务根本无法用函数实现,但是用定义却很好实现。...的缺点 可能大幅度增加程序的长度。 是没法调试的。 由于与类型无关,也就不够严谨。 可能带来运算符的优先级问题,即二义性。 以上就是关于带参的一些总结,如有错误,欢迎指出!

3K10

C语言编程—预处理器

\n") 字符串常量化运算符(#) 定义,当需要把一个的参数转换为字符串常量时,则使用字符串常量化运算符(#)。使用的该运算符有一个特定的参数或参数列表。...这是怎么发生的,因为这个实例会从编译器产生下列的实际输出: printf ("token34 = %d", token34); 这个实例演示了 token##n 连接到 token34 ,在这里,我们使用了字符串常量化运算符...(x)) 使用带有参数的之前,必须使用 #define 指令定义。...参数列表是括括号内,且必须紧跟在名称的后边。名称和左圆括号之间不允许有空格。例如: #include #define MAX(x,y) ((x) > (y) ?...: Max between 20 and 10 is 20 使用#define含参时,参数括号很重要,如上例中省略括号导致运算错误: #include #define square

14250

C语言:预处理详解

使用举例: 1、利用#define定义求一个数的平方 #define SQUARE( x ) x * x 这个接收⼀个参数 x .如果在上述声明之后,你把 SQUARE( 5 ); 置于程序,预处理器就会...吸取上次的经验,我们给定义的参数加上括号,因此我们这样写 #define DOUBLE(x) (x) + (x) 这时又出现了问题,第62行代码按道理应该输出100,但是却输出了55。...再外部再加一个大括号,来保证定义的加法乘法运算之前!...2、⽤于对数值表达式进⾏求值的定义都应该⽤这种⽅式加上括号,避免使⽤时由于参数的 操作符或邻近操作符之间不可预料的相互作⽤。...五、替换的规则 程序扩展#define定义符号和时,需要涉及⼏个步骤。 1. 调⽤时,首先先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们⾸先被替换。 2.

22210

【C语言】预处理&&编译链接&&调试技巧详解

否则替换的时候会将 ; 也替换过去,导致语法错误 1.2.2 #define 定义 #define 机制包括了一个规定,允许把参数替换到文本,这种实现通常会被解释为(macro)或定义(... 注意: 参数列表的左括号必须与name紧邻 如果两者之间有任何空白存在,参数列表就会被释解释为stuff的一部分 如: #define定义也是完全替换,比如: 为了防止出现失误,我们声明的时候需要加上括号...: 我们的时候,如果逻辑需要,我们可以加上足够多的括号来使变得完整 1.2.3 #define 替换规则 程序扩展#define定义符号和时,需要涉及几个步骤 调用时,首先对参数进行检查...注意:这样的连接必须产生一个合法的标识符,否则其结果就是未定义的 1.2.5 带有副作用的参数 当参数的定义中出现超过一次的时候,如果参数带有副作用,那么使用这个的时候就可能出现危险,...可能带来运算符优先级的问题,导致过程容易出现错误 有时候可以做函数做不到的事情,比如:的参数可以出现类型,但是函数做不到 对比 建议: 如果逻辑比较简单,可以使用来实现 如果计算逻辑比较负责

13510

玩转iOS“定义”

三、从一个简单的函数式说起      再来看下上面我们编写的计算面积的,正常情况下好像没什么问题,但是需要注意,归根结底并不是函数,如果完全把其作为函数使用,我们就可能陷入一系列的陷阱,比如这样使用...: CGFloat res = 3.1415926 * 1 + 1 * 1 + 1; 一目了然了,由于运算符的优先级问题导致了运算顺序错误,在编程,所有运算符优先级产生的问题都可以使用一种方式解决:用小括号...,将参数替换了两次,由于参数本身是一个自加表达式,所以被自加了两次,产生了问题,那么这个问题怎么解决呢,C语言中有一种很有用的语法,即使用括号定义代码块,代码块会将最后一条语句的执行结果返回,修改上面定义如下...如果你一下子不能理解为什么这样就可以解决展开的问题,你只需要记住这样一条展开的原则:如果形参有使用#或##这种处理符号,则不会进行参数的展开,否则先展开参数,展开当前。...多语句功能性,要使用do-while包裹       这条原则看上去有些莫名其妙,但是其非常重要,例如,我们需要编写一个自定义的LOG进行打印时添加一些自定义的信息,你或许这样写: #define

3.4K11

预处理指令--定义

预处理指令简介 •C语言在对源程序进行编译之前,先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 •为了区分预处理指令和一般的...1> 名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误 • 2> 对程序中用双引号扩起来的字符串内的字符,不进行的替换操作。...比如: #define R 10  int main ()  {      char *s = "Radio";      return 0;  } •第1行定义了一个叫R的,但是第4行"Radio...所以定义时,一般用一个小括号括住字符串的参数。...(10 * 10) / (2 * 2);,最后输出结果:25 5.与函数的区别 •1.从整个使用过程可以发现,带参数的定义,源程序中出现的形式与函数很像。

1.4K70

【C】程序环境和预处理

,预处理之后产生的结果都放在test.i文件。...所以用于对数值表达式进行求值的定义都应该用这种方式加上括号,避免使用时由于参数 的操作符或邻近操作符之间不可预料的相互作用。...#define 替换规则 程序扩展#define定义符号和时,需要涉及几个步骤。 调用时,首先对参数进行检查,看看是否包含任何由#define定义的符号。...,除非加上括号,否则邻近操作符的优先级可能产生不可预料的后果,所以建议书写的时候多些括号。...函数参数只函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测。 带有副作用的参数 参数可能被替换到的多个位置,所以带有副作用的参数求值可能产生不可预料的结果。

15230

【C语言】#define的认识

这⾥会出现语法错误。 2....#define定义 (1)定义 #define 机制包括了⼀个规定,允许把参数替换到⽂本,这种实现通常称为(macro)或定义define macro)。...,这个问题便轻松的解决了~ #define SQUARE(x) (x) * (x) 所以⽤于对数值表达式进⾏求值的定义都应该⽤这种⽅式加上括号,避免使⽤时由于参数的操作符或邻近操作符之间不可预料的相互作...3.替换的规则 程序扩展#define定义符号和时,需要涉及⼏个步骤。 1. 调⽤时,⾸先对参数进⾏检查,看看是否包含任何由#define定义的符号。...除⾮⽐较短,否则可能⼤幅度增加程序的⻓度。 2. 是没法调试的。 3. 由于类型⽆关,也就不够严谨。 4. 可能带来运算符优先级的问题,导致程容易出现错。 5.

9210
领券