发布日期:2015-12-30 14:32 来源: 标签: 编程语言 C教程 C语言宏定义 C语言带参宏
本章我们主要学习C语言如何定义带参数的宏?带参宏定义的一般形式是什么?下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
Objective-C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去替换形参。
带参宏定义的一般形式为:
    #define 宏名(形参表) 字符串 
在字符串中含有各个形参。
带参宏调用的一般形式为:
    宏名(实参表); 
示例1:带参宏定义和调用实例。
    #import <Foundation/Foundation.h> 
    #define M(y) (y*y+3*y)  
    int main (int argc, const char * argv[]) {  
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
    int s;  
    s = 3*M(3)+4*M(3)+5*M(3);  
    NSLog(@"%i",s);  
    [pool drain];  
    return 0;  
    } 
【程序结果】
    216 
通过带参数的宏定义,可以把y 的值传递了进去,计算的结果和不带参数的宏用法是一
样的。对于带参的宏定义,有以下几点说明:
①带参宏定义中,宏名和形参表之间不能有空格出现。例如把:
    #define MAX(a,b) (a>b)?a:b 
写为:
    #define MAX (a,b) (a>b)?a:b 
将被认为是无参宏定义,宏名MAX代表字符串(a,b)(a>b)?a:b。宏展开时,宏调用语句:
    max=MAX(x,y); 
将变为:
    max=(a,b)(a>b)?a:b(x,y); 
这显然是错误的。
②在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值。要用它们去替换形参,因此必须作类型说明,这是与方法中的情况不一样。在方法中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号替换,不存在值传递的问题。
③在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
④要注意括号的使用,例子如下所示。
示例2:不使用括号的实例。
    #import <Foundation/Foundation.h> 
    #define M(y) y+1  
    int main (int argc, const char * argv[]) {  
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
    int s;  
    s = M(3)*M(3);  
    NSLog(@"%i",s);  
    [pool drain];  
    return 0;  
    } 
【程序结果】
    7 
示例3:使用括号的实例。
    #import <Foundation/Foundation.h> 
    #define M(y) (y+1)  
    int main (int argc, const char * argv[]) {  
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
    int s;  
    s = M(3)*M(3);  
    NSLog(@"%i",s);  
    [pool drain];  
    return 0;  
    } 
【程序结果】
    16 
细心的读者可能发现,这两个代码很类似,但是结果却不同,代码的区别在于:
    #define M(y) y+1 

    #define M(y)(y+1) 
不要小看这些括号的作用,因为宏只是帮我们把拥有宏名的地方替换成字符串。上述两种表达式就会有两种不同的结果:
    3+1*3+1 

    (3+1)*(3+1) 

相关评论

专题信息
    C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。 C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。