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

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

,通过主体编写不平衡的开放括号,可以创建一个从主体内部开始但在主体外部结束的调用。...,但是主体中使用不平衡的开放括号只会造成混淆,应该避免。...运算符优先级问题 大多数定义示例,每次出现的参数名称都带有括号,并且另一括号通常会包围整个定义,这是编写最好的方式。...x_ : y_; }) “({{…})”符号产生一个复合表达式,它的是其最后一条语句的。 如果不使用GNU C扩展,唯一的解决方案是使用min时要小心。...例如计算foo(z)的时,将其保存在变量,然后min中使用该变量: //假设foo返回int类型 #define min(X, Y) ((X) < (Y) ?

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

C语言中的定义

这些参数可以替换列表根据需要出现任意次。 的名字和左括号之间必须没有空格。如果有空格,预处理器会认为是定义一个简单的,其中(x1,x2,…,xn)是替换列表的一部分。...##运算符 C语言的,"##"被称为 连接符(concatenator),它是一种预处理运算符, 用来把两个语言符号(Token)组合成单个语言符号。...定义括号 我们前面定义的替换列表中有大量的圆括号。确实需要它们吗?答案是绝对需要。如果我们少用几个圆括号可能有时会得到意料之外的——而且是不希望有的结果。...对于一个定义哪里要加圆括号有两条规则要遵守: 首先,如果的替换列表中有运算符,那么始终要将替换列表放在括号: #define TWO_PI (2*3.14159) 其次,如果有参数,...becomes do { gets(str); puts(str); } while (0); */ 为什么定义时需要使用do-while语句呢?

6.2K10

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

一、#define的基本语法 C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程,其不能被改变的量。常量常使用#define来定义。...Microsoft Word定义为:“就是能组织到一起作为一独立的命令使用的一系列word命令,它能使日常工作变得更容易”。...这个问题,的解决办法是定义表达式两边加上一括号就可以了。...#define DOUBLE( x) ( ( x ) + ( x ) ) 提示: 所以用于对数值表达式进行求值的定义都应该用这种方式加上括号,避免使用时由于参数的操作符或邻近操作符之间不可预料的相互作用...调用时,首先参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。 2. 替换文本随后被插入到程序中原来文本的位置。对于,参数名被他们的所替换。 3.

25210

【C语言】#define的认识

#define定义 (1)定义 #define 机制包括了⼀个规定,允许把参数替换到⽂本,这种实现通常称为(macro)或定义 (define macro)。...替换⽂本时,参数x被替换成a + 1,所以这条语句实际上变成了: printf ("%d\n",a + 1 * a + 1 ); 所以实际上结果为:11 ✨✨解决办法: 定义上加上两个括号...,这个问题便轻松的解决了~ #define SQUARE(x) (x) * (x) 所以⽤于对数值表达式进⾏求值的定义都应该⽤这种⽅式加上括号,避免使⽤时由于参数的操作符或邻近操作符之间不可预料的相互作...3.替换的规则 程序扩展#define定义符号和时,需要涉及⼏个步骤。 1. 调⽤时,⾸先参数进⾏检查,看看是否包含任何由#define定义的符号。...对于,参数名被他们的所替换。 3. 最后,再次结果⽂件进⾏扫描,看看它是否包含任何由#define定义的符号。如果是,就重复 上述处理过程。 注意: 1.

9710

预处理指令、typedef、条件编译、多文件代码

文件名双引号内:先在当前目录搜索文件,再到编译器的包含目录搜索文件。 对于stdio.h文件来说,它是编译器自带的文件,在编译器的包含目录。所以使用括号,即可找到该文件。...,参数n) 替换体 虽然由带参数的#define定义函数,使用方法上很像函数。但是,它的本质依然是将替换为对应的替换体。由此,如果简单地将其当做函数使用,会出现一些问题。...因此,为了保证函数展开后的表达式能够优先计算,请在替换体两边加上括号。 最后,为了保证不要在一个表达式同一个变量多次进行自增、自减操作。...} Visual Stduio 2019,覆盖定义并不会导致编译报错而停止 不过,更妥当的做法是:使用预处理指令#undef,取消这个定义,再重新定义它。...所以,我们将Person结构类型的定义与符号常量NAME_LENGTH,文件person.h也写了一遍。 为什么没有重定义报错 代码中出现了重复的声明或定义,构建时为什么不会出现重定义报错呢?

1K40

C语言编程规范 clean code

,包括全局变量,局部变量,函数声明或定义的参数,带括号的参数。...理由: 代码逻辑直观,易读; 已有条件语句代码上增加新代码时不容易出错; 对于条件语句中使用函数式时,没有大括号保护容易出错(如果定义时遗漏了大括号)。...ErrLog(__FILE__, __LINE__, fmt, ##__VA_ARGS__) 规则6.1 定义时,参数要使用完备的括号 参数展开时只是文本替换,在编译时再求值。...当调用点展开后,定义的表达式和变量融合到调用代码,可能会出现变量名冲突和内语句被分割等问题。...使用此类务必特别小心。 包含不完整语句时,可以例外。比如用封装 for 循环的条件部分。 非多条语句,或单个 if/for/while/switch 语句,可以例外。

4.2K10

C语言编程规范 clean code

,包括全局变量,局部变量,函数声明或定义的参数,带括号的参数。...理由: 代码逻辑直观,易读; 已有条件语句代码上增加新代码时不容易出错; 对于条件语句中使用函数式时,没有大括号保护容易出错(如果定义时遗漏了大括号)。...ErrLog(__FILE__, __LINE__, fmt, ##__VA_ARGS__) 规则6.1 定义时,参数要使用完备的括号 参数展开时只是文本替换,在编译时再求值。...当调用点展开后,定义的表达式和变量融合到调用代码,可能会出现变量名冲突和内语句被分割等问题。...使用此类务必特别小心。 包含不完整语句时,可以例外。比如用封装 for 循环的条件部分。 非多条语句,或单个 if/for/while/switch 语句,可以例外。

5.4K10

预处理指令、typedef、条件编译、多文件代码

文件名双引号内:先在当前目录搜索文件,再到编译器的包含目录搜索文件。 对于stdio.h文件来说,它是编译器自带的文件,在编译器的包含目录。所以使用括号,即可找到该文件。...,参数n) 替换体 虽然由带参数的#define定义函数,使用方法上很像函数。但是,它的本质依然是将替换为对应的替换体。由此,如果简单地将其当做函数使用,会出现一些问题。...最后,为了保证不要在一个表达式同一个变量多次进行自增、自减操作。若函数的替换体内在一个表达式多次使用同一个参数,那么请不要在函数的参数内填自增、自减表达式。...} Visual Stduio 2019,覆盖定义并不会导致编译报错而停止 不过,更妥当的做法是:使用预处理指令#undef,取消这个定义,再重新定义它。...所以,我们将Person结构类型的定义与符号常量NAME_LENGTH,文件person.h也写了一遍。 为什么没有重定义报错 代码中出现了重复的声明或定义,构建时为什么不会出现重定义报错呢?

1.2K00

计算机预处理详解

#define 定义 #define 机制包含了一个规定,允许把参数替换到文本,这种实现通常称为或者定义 定义方式 #define name(parament-list) stuff parament-list...为参数 注: 1.参数列表的左括号必须与name紧邻,否则可能会被当成stuff 2.我们定义用来求值的时候尽量都加上括号,避免进行替换之后会因为优先级问题,导致结果不是我们预期想要的结果...所以比函数程序的规模和速度方面更胜一筹。 与类型无关。 当然,相比函数也有缺点 每次使用的时候,一份定义的代码插入到程序。除非比较短,否则可能会大幅度增加程序的长度。...3、参数的替换是不经过计算的,有可能会带有副作用,所以我们体的时候一般能加括号的地方都不要吝啬括号,但有时候这也不能解决副作用的问题。函数传参时传的是,不会产生副作用。...6、函数调用时会产生时间和空间上的开销;调用时则没有,因为进行的只是简单的字符串替换。 7、如果使用比较多,展开时会产生大量的代码,大大降低运行时间。

6200

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

这又这么解决: 定义表达式的两边再加上一括号就可以了。...#define DOUBLE( x ) ((x) + (x)) 所以我们得出结论: 用于对数值表达式进行求值的定义都应该用这种方式加上括号,避免使用时由于参数的操作符或邻近操作符之间不可预料的相互作用...2.4 #define 替换规则 程序扩展#define定义符号和时,需要涉及几个步骤。 调用时,首先其参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。...而对于函数来说,我们定义好的函数程序只留存一份,我们每次使用,只需要调用一下就行了。 是没法调试的。 由于类型无关,也就不够严谨。 这是它的一个优点,但同时也是缺点。...这个其实我们的时候就演示过了,使用的时候,有些地方如果我们不加括号,可能就会导致由替换产生的表达式因为操作符优先级的问题而并没有按照我们预想的次序进行求值。

13810

单片机开发之C语言编程基本规范

其程序块结束行"}"的右方应加表明该程序块结束的标记"end of……", 尤其多重嵌套时。 3.4 变量、常量、的注释 同一类型的标识符应集中定义,并在定义之前一行其共性加以统一注释。...单个标识符的注释加在定义语句的行尾。 全局变量一定要有详细的注释,包括其功能、取值范围、哪些函数或过程存取它以及存取时的注意事项等。 注释用"//…//"的格式。...5) 表达式,若有多个操作符连写的情况,应使用空格它们分隔: 6) 两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符前后均加一个空格;两个以上的关键字、变量、常量进行非对等操作时,....c文件: #define FILE_FLAG .h文件:& 6.程序结构 6.1 基本要求 1) 有main()函数的.c文件应将main()放在最前面,并明确用void声明参数和返回...2) 中断的开放和禁止 使用定义方式开放或禁止中断,定义语句放在EnDisInt.h头文件名的定义方法: 开放中断以Enable标识,包含中断名,名最后以Int结束。

1.8K20

讲通CC++预编译条件编译指令 #ifdef,#ifndef,#endif,#define,…

#define 这个也不陌生吧,定义用的。 有关#define这个定义C语言中使用的很多,因为#define存在一些不足,C++强调使用const来定义常量。...并没有实现程序的B+2的平方 * 预处理的时候,替换成如下的结果:b+2*b+2 * 正确的定义应该是:#define SQR(x) ((x)*(x)) * 所以,尽量使用括号,将参数括起来...你无法一个头文件的一段代码作pragma once声明,而只能针对文件。 其好处是,你不必再费劲想个名了,当然也就不会出现名碰撞引发的奇怪问题。大型项目的编译速度也因此提高了一些。...#ifdef、#ifndef、#endif #ifdef用于判断某个是否定义,和#ifndef功能正好相反,二者仅支持判断单个是否已经定义 #endif用于终止#if预处理指令。...判断某个是否被定义时,应当避免使用#if,因为该可能就是被定义为0。而应当使用#ifdef或#ifndef。 注意: #if、#elif之后的只能是对象

4.3K40

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

其中DSP与FPGA通过两个带参进行数据交互(DSP与FPGA通过一块共享内存来实现数据交互,我这边的DSP只要往共享内存写入数据即为往FPGA写数据,往共享内存读取数据就是读取FPGA发送过来的数据...volatile嵌入式编程中用得很多,如在Cortex-M3内核MCU的内核文件的C函数内嵌汇编中使用了大量的volatile关键字: ?...此处等号右边的 (((volatile uint32*)base_addr)[(offset)])) 可以等价于: *(((volatile uint32*)base_addr) + offset)) 为什么要在函数实体的参数的两边加上括号呢...为什么要在函数实体的两边加上括号呢? 答:虽然有时候不加括号也没什么问题,但是,更严格的做法是给参数加括号、给函数实体加括号,这样可以避免二义性。...\n\n"); } // 验证函数FPGA_READ FPGA_READ(data_read, ptr, 5); // 此时data_read的会被arr[5]的覆盖 printf

1.3K40

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

) ); 这里还有一个定义: #define DOUBLE(x) (x) + (x) 定义我们使用括号,想避免之前的问题,但是这个可能会出现新的错误。...我们发现替换之后: printf ("%d\n",10 * (5) + (5)); 乘法运算先于定义的加法,所以出现了 55 这个问题,的解决办法是定义表达式两边加上一括号就可以了。...#define DOUBLE( x) ( ( x ) + ( x ) ) 提示: 所以用于对数值表达式进行求值的定义都应该用这种方式加上括号,避免使用时由于参数的操作符或邻近操作符之间不可预料的相互作用...调用时,首先参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。 替换文本随后被插入到程序中原来文本的位置。对于,参数名被他们的所替换。...最后,再次结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。 注意: 参数和#define定义可以出现其他#define定义的符号。

23111

C语言——R预处理详解

: #define DOUBLE(x) (x) + (x) 定义我们使⽤了括号,想避免之前的问题,但是这个可能会出现新的错误。...我们发现替换之后: printf ("%d\n",10 * (5) + (5)); 乘法运算先于定义的加法,所以出现了 55 . 这个问题,的解决办法是定义表达式两边加上⼀括号就可以了。...#define DOUBLE( x) ( ( x ) + ( x ) ) 提示: 所以⽤于对数值表达式进⾏求值的定义都应该⽤这种⽅式加上括号,避免使⽤时由于参数的操作符或邻近操作符之间不可预料的相互作...调⽤时,⾸先参数进⾏检查,看看是否包含任何由#define定义的符号。如果是,它们⾸先被替换。 2. 替换⽂本随后被插⼊到程序中原来⽂本的位置。对于,参数名被他们的所替换。 3....最后,再次结果⽂件进⾏扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。 注意: 1. 参数和#define定义可以出现其他#define定义的符号。

10210

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

带参我们的嵌入式编程中使用得非常多,其定义如下: define 标识符(参数列表) 字符序列 其中参数列表的参数之间用逗号分隔,字符序列应包含参数表的参数。...定义带参数的时,名标识符与左圆括号之间不允许有空白符,应紧接在一起,否则变成了无参数的定义。 并且,字符序列与其每一个参数必须用括号扩起来,否则该定义可能会产生二义性 。...带参与函数的区别 查看以上带参,我们发现带参似乎与函数似乎长得很像,它们之间有什么区别和联系呢?TI为什么使用一些算法进行封装呢,难道使用函数来封装不可以吗?答案是可以的: ?...除此之外,与函数的不同点还有:预处理阶段展开,占用的是编译时间,函数实在程序运行时调用的,占用的是程序运行的时间;参数没有类型说明,也没有返回的概念。...和使用函数相比,使用的不利之处在于每次使用时,一份定义代码的拷贝都会插入到程序。除非非常短,否则使用会大幅度增加程序的长度。 还有一些任务根本无法用函数实现,但是用定义却很好实现。

3K10

C语言预处理指令-学习二十一

使用定义的优点: 可提高源程序的可维护性; 可提高源程序的可移植性; 减少源程序重复书写字符串的工作量。 关于定义几点说明: 名一般用大写字母表示,以示与变量区别。但这并非是语法规定。...2.有参定义,形参不分配内存单元,因此形参不必做类型定义; 而替换的实参有具体的要用它们去代换形参,因此实参必须做类型说明。 在有参,只是符号替换。...3.调用有参名时,一括号必不可少,圆括号实参的个数应该与形参个数相同, 如果有多个参数,参数之间用逗号隔开。 4.定义的形参是标识符,而调用的实参可以是表达式。...替换时实参表达式不做计算直接照原样替换。 5.定义,字符串内的形参和整个表达式通常要用括号括起来以避免出错。...条件编译 如果希望程序的一部分只满足一定条件时才进行编译,也就是这部分内容指定编译的条件,可以使用条件编译实现。

53730

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券