C语言宏的几个注意点

原创 2017年01月03日 10:15:36
  • 宏定义
    宏定义中要注意的主要有两点,一点是宏参数可能被evaluation多次。比如:
#define max(A, B) ((A) > (B) ? (A) : (B))
max(i++, j++) /* i和j中较大的值会被evaluation2次*/

当然这里宏的好处是可以不用指定A和B的类型。
另一点是宏跟括号有关的时候可能会改变evaluation的顺序。比如

#define square(x) x*x
square(z+1)
  • 条件包含
    这里面主要是关于宏的理解。
#define name replacement text

subsequent occurrences of the token name will be replaced by the replacement text. The name in a #define has the same form as a variable name; the replacement text is arbitrary. Normally the replacement text is the rest of the line, but a long definition may be continued onto several lines by placing a \ at the end of each line to be continued.

所以说一般的宏都只有一行,如果是多行的话需要用’\’去结尾。因此下面的条件包含中的宏定义只是用于条件包含,而不应该在其它地方使用。经过实验证明HDR在源文件的其它地方没有什么作用。千万不要认为将HDR定义成hdr.h的内容。

#if !defined(HDR)
#define HDR
/* contents of hdr.h go here */
#endif

或者

#ifndef HDR
#define HDR
/* contents of hdr.h go here */
#endif

The first inclusion of hdr.h defines the name HDR; subsequent inclusions will find the name defined and skip down to the #endif. A similar style can be used to avoid including files multiple times. If this style is used consistently, then each header can itself include any other headers on which it depends, without the user of the header having to deal with the interdependence.
条件包含是一个很巧妙的设计,只要每个头文件都使用条件包含,那么就可以防止重复声明变量(如果没有条件包含将变得很复杂)。

参考文献:《TLCL》

版权声明:本文为博主原创文章,未经博主允许不得转载。

C/C++宏定义注意事项

三种预处理功能  C++提供的编译预处理功能主要有以下三种:   (一) 宏定义   (二) 文件包含   (三) 条件编译   在C++中,我们一般用const定义符号常量。很显然,用con...
  • yuanxuegui2008
  • yuanxuegui2008
  • 2011年05月02日 23:31
  • 1991

c语言 可变参数 三个点 ...

1.函数中使用可变参数表C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, …); 它除了有一个参数...
  • believnjdvnkds
  • believnjdvnkds
  • 2016年07月29日 15:30
  • 279

C语言结构体的使用及注意事项

结构(struct)      结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。  结构中可以使用不同的数据类型。      1. 结构说明和结构变量定义  ...
  • Starbucks_star
  • Starbucks_star
  • 2014年09月24日 20:01
  • 1477

【转载】C语言中指针使用的注意事项

相信大家对指针的用法已经很熟了,这里也不多说些定义性的东西了,只说一下指针使用中的注意事项吧。 一.在定义指针的时候注意连续声明多个指针时容易犯的错误,例如int * a,b;这种声明是声明了...
  • u011349387
  • u011349387
  • 2015年05月05日 18:03
  • 1102

学习C语言的一些需要注意的点

C语言学习 1.指针数组与二维数组指针 int *p[3];//指针数组。 int (*p)[3];//定义了一个指针,指向int[3]这种数据类型,指向二维数组的指针。 int buf[3...
  • In_No_Vation
  • In_No_Vation
  • 2018年02月08日 02:46
  • 135

关于标准C语言的预定义宏

标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。下面预定义宏表,被我抄了下来。__LINE__ 当前...
  • mouse1598189
  • mouse1598189
  • 2016年01月08日 21:50
  • 755

C语言宏定义##连接符和#符的使用及其它宏定义注意事项

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念)。下面对常遇到的宏的使用问题做了简单总结。 关于#和## 在C语言的宏中,#的功...
  • dadoneo
  • dadoneo
  • 2013年04月07日 12:20
  • 1809

C语言字符串使用注意事项

C语言字符串使用注意事项
  • linux_embedded
  • linux_embedded
  • 2014年09月30日 14:25
  • 1161

C语言宏详解

在介绍C语言的宏定义之前,需要介绍一下预处理。 什么是预处理呢?所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。预处理是C语言的一个重要的功能,它由预处理程序负责完成。当对一...
  • u012871389
  • u012871389
  • 2016年08月14日 23:59
  • 1254

C语言的艺术:强大的宏

这次不讲算法了,讲一讲C语言里面一个很强大的功能:宏。 宏,是一个大家都很熟悉的概念,很多人也经常使用宏,但是用的都不怎么深,我所知道的最常见的用法就是用宏抽象数组长度。#define N 99 a...
  • restlessssh
  • restlessssh
  • 2016年05月31日 00:06
  • 3117
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言宏的几个注意点
举报原因:
原因补充:

(最多只允许输入30个字)