c语言宏定义_掌握C语言,中文编程不是梦

0c92f70450ed57d561fd0eef4a601b61.png

43b1c4c1a2b1e70282fd7e1f5d800037.png

文/Edward


前面我们在讲节程序编译的时候,编译器做的第一步就是预处理。C语言的预处理,其实是编译器在对整个工程编译之前做的一些文本性质的工作,例如我们经常使用的#include,这就是一个典型的文件包含预处理,当启动编译的时候,编译器首先先做预处理,即将#include后面包含的那个文件里面的内容,全部复制到当前的.c文件中来,接着,再进行C语言源文件的编译。除了文件包含之外,C语言中的预处理还有很多,而这些预处理对于我们编程来说,都可以帮助我们提高代码的易读性和代码质量。


#define预处理

#define预处理的作用,一般在一些书上面仅仅称其为“宏定义”,其实这个称呼是不严谨的,一个#define预处理其实包含两种意思,第一种意思是“宏定义”,第二个层面的意思是替换,下面的内容,我们将会以上面两层意思分开讲解。

#define替换

也许我们在单片机编程中,绝大多数用户使用的仅仅只是#define预处理的替换功能,#define的替换格式为:

#define NAME 需要替换的内容

比如,我们一般常用的用来定义圆周率Π,就可以写成:

#define PI 3.1415926

那么以后的程序代码里面只要出现PI这个标号,编译器都将直接将其替换成一个浮点数3.1415926。

在用#define定义标号的时候需要注意,一般地我们都以大写字母来拼写这个标号,而且这个标号在用#define定义时,我们都默认地将其放入相应的.h头文件中。如图1所示的求圆形面积和周长的程序。

988493186e85fde7de6c749968b6e58e.png
图1 求圆的周长和面积

用#define定义的标号不止可以替换一些数值,还可以替换关键词和函数,例如,想要让C语言变成一个中文的编程语言,就可以直接用#define定义中文标号来替换C语言的关键词,如图2所示。

a3fa4adfb4ebb1f403b5be507806f8c4.png
图2 用中文编写C语言

需要注意的是,MinGW编译器自身不支持中文类型的变量,所以如果要尝试只能在Visual studio软件中使用MSVC来尝试。

#define除了可以替换数值、关键词和函数之外,还可以用来替换程序语句,我们可以将需要执行的程序语句,利用#define重新定义成一个标号,如图3所示。

60a567e434a4db7630dbb4130434c3b7.png
图3 #define替换程序语句

在图3中,我们利用#define定义了一个程序计算语句,这个标号在程序执行的时候就会自动被替换成后面的2*3运算语句去执行了。接着我们再来看一段代码。如8-1-4所示。

05bc6292190acd1020e946de80050829.png
图4 错误的#define替换

按照我们正常的理解,图4中的程序理论上来说应该输出25才对,但是为什么结果却和我们想象的不一样呢?这是因为#define定义的标号在编译的时候是文本直接替换的,因此当在程序里面执行STENCE*STENCE的时候,我们认为的应该执行(2+3)*(2+3),而实际上STENCE是直接被2+3替换的,所以在程序编译时的真实替换应该是2+3*2+3,因此输出的值才和我们想象中的不一样,这就是典型的#define替换错误。只需要在2+3外面加上括号即可,如图5所示。

442aa9138be7516f1107e5bfd2df28df.png
图5 正确的#define程序语句替换

而当我们在替换多条语句的时候,一定要用“do{……}while(0);“的形式来将标号里面的多条执行语句打包好,以防止不必要的错误产生。如图6所示。

2d9af34fba0b329c9001e77645a91870.png
图6 #define替换多条程序语句

定义宏

#define除了用作简单和复杂的程序文本替换之外,这个机制还包括了一个规定,即可以将参数替换到文本中去进行计算,这种实现通常被称为宏(macro)。

宏定义的声明方式为:

#define 宏名称(参数1, 参数2, ……) 带参数的表达式

当宏被调用时,参数列表中的每一个值都会与宏表达式实体中的每一个值所一一对应,并且进行替换。如,我们定义一个用于计算平方的宏,就可以写成:

#define SQUARE(x) x*x

下面程序使用宏定义计算5的平方,就可以直接使用SQUARE(5)。

如图7所示,我们可以将圆的面积和周长计算分别写成宏的形式进行运算。

e8f1fe5dd3a430b331599fe43fae66b0.png
图7 宏定义计算圆的周长和面积

但是还需要注意的是,宏定义的参数替换也仅仅是文本形式的替换,如图8所示。

73f7e77cd4c005444101733f9128b643.png
图8 宏定义的错误计算

图8的程序中,我们原本想的是,输入的半径变成11之后,通过调用宏,并且传入参数rad + 1,理论上来说应该和8-1-7中输出一样的计算结果才对,但是实际上,这个传入的参数在替换时也是仅仅被当作文本去替换了,因此图8程序实际的计算过程应该是,以周长为例,2*3.1415926*11+1=70.12。所以在宏定义的时候,我们也应该为其参数增加括号,以提高整个宏的完整性。如图9所示。

24150e76949821848dcbedd2464fa261.png
图9 宏定义参数的正常使用

除了上述的功能之外,宏定义最常被使用的就是比较两个数的大小了,之前我们比较两个书的大小都是使用if来判断的,但是学了宏之后,结合三目运算符就可以直接使用一个宏定义来完成了,如图10所示。

455c17bdaab21d95e841064f9820cc3a.png
图10 使用宏定义比较大小

http://weixin.qq.com/r/BjsfB7PEhO77rfdk924U (二维码自动识别)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 华为C语言编程规范v5_1是华为公司为了统一C语言代码风格、提高代码质量而制定的一套规范。下面是关于该规范的一些要点: 1. 命名规则: - 变量、函数、宏等采用驼峰命名法,如"getMaxValue"; - 宏和常量全部大,并使用下划线分隔,如"MAX_VALUE"; - 结构体和枚举类型使用首字母大的驼峰命名法。 2. 编码规则: - 一个文件只包含一个功能模块,保持文件简洁; - 不使用全局变量,尽量使用局部变量; - 嵌套循环及时退出,减少循环次数。 3. 注释规则: - 在代码片段前添加注释,解释代码功能; - 对复杂算法或特殊情况进行详细注释; - 注释必须与代码同步更新。 4. 错误处理: - 所有可能出错的地方都要进行错误处理; - 错误信息清晰明了,有助于定位问题; - 不要忽略错误返回值。 5. 内存管理: - 动态分配的内存要及时释放; - 避免内存泄漏和悬空指针。 6. 代码复用: - 避免重复代码,提取相同部分为函数或宏; - 提供合适的接口和模块,方便其他代码重用。 7. 关于编码风格: - 代码缩进4个空格,不使用制表符; - 每行代码不超过80个字符; - 函数之间空行分隔; - 运算符两侧加空格; - 使用括号来明确优先级和逻辑关系。 8. 其他规定: - 不使用不明确的预处理宏; - 禁止使用goto语句; - 不使用位域。 华为C语言编程规范v5_1的目的是规范华为公司的C语言代码,提高代码的可读性、可维护性和可靠性。遵循这些规范可以使得代码更加规范统一,减少错误和bug的产生,提高代码的质量和效率。 ### 回答2: 华为C语言编程规范v5_1是华为公司为了规范C语言程序设计而制定的一套规范。这套规范主要包含了C语言程序的规范、命名规范、注释规范、代码布局规范等内容。 在编C语言程序时,规范要求代码风格应清晰明了、简洁易懂。命名规范要求采用驼峰命名法,并给出了一些命名规则的例子。注释规范要求对关键代码进行详细注释,以方便他人理解程序的逻辑和功能。代码布局规范要求使用空格、缩进等来使代码的结构更加清晰。 此外,规范还对避免同名宏和全局变量的冲突、避免使用全局变量等进行了规定。规范还提出了一些代码书的规则,如避免使用goto语句、避免在循环使用浮点计算等。 通过遵守华为C语言编程规范v5_1,可以确保代码的可读性和可维护性。规范的制定旨在提高代码质量,降低代码维护的成本,让程序更加稳定和高效。 然而,需要注意的是,华为C语言编程规范v5_1是面向华为公司内部的,对于其他公司或个人来说,并不一定适用。因此,在使用这套规范时,需要根据自己的实际情况进行适度的调整和修改,以满足自己的编程需求。 ### 回答3: 华为C语言编程规范(Version 5.1)是华为公司针对C语言编程的一套规范和指南。下面以300字回答。 华为C语言编程规范是为了保证代码的质量和可维护性,统一团队内部的编程风格而制定的。规范主要包括以下几个方面: 1. 命名规范:规定了变量、函数、结构体等的命名方式,要求具有可读性和简洁性。变量名应该有意义,使用小字母,多个单词之间用下划线分割。函数名应该使用动词开头,结构体名应该使用名词或名词短语。 2. 注释规范:规定了代码注释的法和规范。注释应该清晰明了,准确描述代码的功能和目的。在复杂的代码逻辑或算法时,应该详细解释。 3. 编码风格:规定了代码的缩进、对齐、空格等方面的风格。缩进一般使用四个空格,对齐使用空格而不是制表符,代码行的长度不宜过长。 4. 错误处理:规定了对于错误和异常情况的处理方式。对于可能发生错误的地方,应该添加适当的错误处理机制,如返回错误码或抛出异常。 5. 函数使用规范:规定了函数定义和使用的规范。函数应该尽量短小,功能单一,可读性强。函数的参数应该正确设置默认值,避免函数调用时产生歧义。 6. 内存管理:规定了内存的分配和释放方式。应该及时释放不再使用的内存,避免内存泄漏的问题。 遵守华为C语言编程规范可以提高代码的可读性、可维护性和可移植性,有利于团队协作和项目的顺利进行。通过规范约定统一的编程风格,有助于提高代码质量并减少潜在的错误和问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值