关于宏需要注意的问题
1.#define宏与函数之间的优劣:
宏的执行速度比函数快得多,函数需要调用、返回等操作。函数只能对特定的类型操作,而宏是类型无关的,宏还可以实现一些函数无法实现的操作。但宏需要将所有代码拷贝到调用程序中,增加了代码长度。
所以:宏比较适合执行简单的计算,如求2个值中的较大值。 如果宏代码比较长,并且频繁被调用,还是声明为函数比较好。
2.预定义符号(由预处理器定义的符号)
有_FILE_ , _LINE_ , _DATE_ , _TIME_ , _STDC_
3.注意宏使用中的一些细节
(1) 如下:
#define PRINT(FORMAT, VALUE) \
printf(“The value of ” #VALUE); \
“is” FORMAT “\n”, VALUE )
Print(“%d”, x + 3);
输出为: The value of x + 3 is 25
printf() 函数的第一个参数必须为字符串,所以比必须在VALUE前面加上#。#VALUE的目的就是将宏参数VALUE转换为字符串形式。
(2 ) ##的作用:
把两边的符号连接成一个符号。如下:
#define ADD_TO_SUM( sum_number, value ) \
sum ## sum_number += value
ADD_TO_SUM( 5, 25 ); // sum5 += 25;
(3)宏定义中的参数往往要打上不止一层的括号。
4. 一些宏命令:
#if constant-expression
statements
#elif constant-expression
otherstatements
#else
otherstatements
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
(4) #error 用来生成错误指令。
(5) #line
1.#define宏与函数之间的优劣:
宏的执行速度比函数快得多,函数需要调用、返回等操作。函数只能对特定的类型操作,而宏是类型无关的,宏还可以实现一些函数无法实现的操作。但宏需要将所有代码拷贝到调用程序中,增加了代码长度。
所以:宏比较适合执行简单的计算,如求2个值中的较大值。 如果宏代码比较长,并且频繁被调用,还是声明为函数比较好。
2.预定义符号(由预处理器定义的符号)
有_FILE_ , _LINE_ , _DATE_ , _TIME_ , _STDC_
3.注意宏使用中的一些细节
(1) 如下:
#define PRINT(FORMAT, VALUE) \
printf(“The value of ” #VALUE); \
“is” FORMAT “\n”, VALUE )
Print(“%d”, x + 3);
输出为: The value of x + 3 is 25
printf() 函数的第一个参数必须为字符串,所以比必须在VALUE前面加上#。#VALUE的目的就是将宏参数VALUE转换为字符串形式。
(2 ) ##的作用:
把两边的符号连接成一个符号。如下:
#define ADD_TO_SUM( sum_number, value ) \
sum ## sum_number += value
ADD_TO_SUM( 5, 25 ); // sum5 += 25;
(3)宏定义中的参数往往要打上不止一层的括号。
4. 一些宏命令:
(1) #undef name 将一个宏定义移除(比如一个现存的名字需要被重新定义,那旧定义必须首先被移除)。
#if constant-expression
statements
#elif constant-expression
otherstatements
#else
otherstatements
#endif
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
(4) #error 用来生成错误指令。
(5) #line
(6) #progma