`

关于宏定义需要注意的几点

阅读更多

对于宏定义还要说明以下几点:

1)       宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。

2)       宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

3)       宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用# undef命令。

例如:

    #define PI 3.14159

    main()

    {

      ……

    }

    #undef PI

f1()

{

      ……

    }

表示PI只在main函数中有效,在f1中无效。

4)       宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。

【例9.2

#define OK 100

main()

{

  printf("OK");

  printf("\n");

}

上例中定义宏名OK表示100,但在printf语句中OK被引号括起来,因此不作宏代换。程序的运行结果为:OK这表示把OK当字符串处理。

5)       宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。

例如:

    #define PI 3.1415926

#define S PI*y*y          /* PI是已定义的宏名*/

对语句:

    printf("%f",S);

在宏代换后变为:

    printf("%f",3.1415926*y*y);

6)       习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。

7)       可用宏定义表示数据类型,使书写方便。

例如:

    #define STU struct stu

在程序中可用STU作变量说明:

    STU body[5],*p;

            #define INTEGER int

在程序中即可用INTEGER作整型变量说明:

    INTEGER a,b;

应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。

宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。

请看下面的例子:

    #define PIN1 int *

    typedef (int *) PIN2;

从形式上看这两者相似, 但在实际使用中却不相同。

下面用PIN1PIN2说明变量时就可以看出它们的区别:

PIN1 a,b;在宏代换后变成:

    int *a,b;

表示a是指向整型的指针变量,而b是整型变量。

然而:

    PIN2 a,b;

表示a,b都是指向整型的指针变量。因为PIN2是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型, 但毕竟是作字符代换。在使用时要分外小心,以避出错。

8)       对“输出格式”作宏定义,可以减少书写麻烦。

【例9.3】中就采用了这种方法。

#define P printf

#define D "%d\n"

#define F "%f\n"

main(){

  int a=5, c=8, e=11;

  float b=3.8, d=9.7, f=21.08;

  P(D F,a,b);

  P(D F,c,d);

  P(D F,e,f);

}

分享到:
评论

相关推荐

    宏定义引用

    1. **副作用**:由于宏定义不具有参数类型检查的功能,因此在实际使用时需要特别注意传入参数的正确性。 2. **避免嵌套问题**:如果宏定义中包含多个表达式,则每个表达式都应该用括号括起来,以避免潜在的问题。 #...

    邮件系统内部广告系统:广告模板信件中的宏定义

    4. 生成邮件广告模板的注意事项:虽然使用宏可以极大地提高邮件发送的灵活性,但是在设计模板时,需要考虑以下几点: - 确保使用的宏在邮件系统中已经被定义,且能够被正确解析。 - 在编写模板时,避免将宏暴露给...

    Inphic专业级宏定义游戏鼠标-安装程序

    在安装Inphic专业级宏定义游戏鼠标的程序时,还应注意以下几点: - **系统兼容性**:确保您的电脑操作系统与鼠标驱动程序兼容,通常是Windows 7及以上版本。 - **防病毒软件**:虽然大部分安装程序是安全的,但在...

    处理C预编译宏定义详解

    尽管宏定义带来了很多便利,但在使用时也需要注意以下几点: - **避免副作用:** 使用宏时要确保不会产生意外的副作用。 - **宏展开:** 在复杂的表达式中使用宏时要注意宏的展开顺序。 - **调试问题:** 宏定义可能...

    C语言常用宏定义技巧

    本文将详细介绍几种常见的宏定义技巧及其应用场景。 #### 二、防止一个头文件被重复包含 为了避免在大型项目中因多个源文件包含相同的头文件而导致的重复编译问题,通常会采用如下方法: ```c #ifndef COMDEF_H #...

    关于freertos移植使用所需要注意的点

    在将FreeRTOS移植到目标板上时,需要注意以下几个重要点。 首先,在移植之前需要从官网下载最新版本的FreeRTOS源码,並找到相应的Demo和Source文件。其中,Demo文件夹中包含了一些官方移植的例程,可以用来做参考。...

    C语言中宏定义"#"和"##"符号的用法

    在使用"#"和"##"符号时,需要注意以下几点: * 如果宏定义中使用了"#"或"##"符号,那么宏参数将不会再展开。 * 如果宏参数是一个宏,那么需要添加一个中间转换宏,以确保宏参数的正确展开。 五、应用实例 以下是...

    lwip--有趣的数组定义(预处理)

    宏定义在C语言中是一种预处理指令,它允许程序员为常量、表达式或者程序中的代码段定义一个标识符。在宏的使用过程中,需要注意宏的定义...6. 宏定义不涉及类型检查,使用时需要特别注意参数的类型和表达式的正确性。

    带参数的宏定义理解篇

    需要注意的是,宏定义中的参数没有类型信息,与函数声明不同,函数声明会明确指定参数的类型。 例如,定义一个简单的加法宏: ```c #define add(a, b) a + b ``` 使用这个宏时,`add(a, b)`会被替换为`a + b`。这...

    内联函数inline与宏定义深入解析

    对比内联函数和宏定义,我们可以总结以下几点差异: 1. **展开时机**:内联函数在编译时展开,而宏在预编译时展开。 2. **代码嵌入**:内联函数的代码直接嵌入到目标函数中,而宏仅进行文本替换。 3. **编译功能**...

    sas宏语言基础

    宏变量的引用需要注意以下几点: - **宏变量引用**:直接引用宏变量时,其值将被直接替换,如`proc print data=&data; var &var; run;`。 - **字符常量中引用宏变量**:需要使用双引号,如`'textinline&j'`。 - **...

    第十一章 预处理.docx

    对于宏定义还要说明以下几点: 1. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。 ...

    c代码-带参宏定义1

    带参数的宏定义需要注意以下几点: 1. **防止副作用**:由于宏展开发生在编译时,它们不会检查副作用。比如,如果你在宏定义中两次使用参数,如`#define INC_X(x) x++; x++`,这可能导致意外的结果。所以在编写宏时...

    C语言程序设计姜学峰PPT课件.pptx

    宏定义有几点需要注意: 1. 预处理命令必须以`#`开头。 2. 宏定义不是C语句,所以不需要以分号结尾。 3. 通常情况下,宏定义写在函数外部,源文件的开头。 4. 一个宏命令只能定义一个宏名。 5. 宏字符串中的每个字符...

    G502 FPS 通用压枪宏

    1. **宏定义**:首先,你需要了解什么是宏,宏是预先定义的一系列按键操作,可以一键执行,节省玩家在游戏中的反应时间。 2. **罗技G502鼠标设置**:G502是一款高级游戏鼠标,拥有多个可编程按键和自定义DPI设置。...

    C语言条件编译PPT课件.pptx

    在使用宏定义时有几点需要注意: 1. 宏名应避免与已有的标识符冲突,尤其是在预定义中使用过的符号。 2. 宏定义可以嵌套,但在使用之前需要确保所有涉及的宏已经被定义。 3. 宏定义的字符串可以包含常量、表达式,但...

    c++语言 工具 宏替换工具

    在使用宏替换工具时,要注意以下几点: - **副作用**:宏替换是文本替换,可能导致意外的副作用,比如`#define MAX(a, b) ((a) > (b) ? (a) : (b))`这样的宏可能会在不期望的地方改变运算顺序。 - **括号问题**:...

    word 宏 以上全选

    1. **Sub 以上全选()**:这是VBA宏定义的开始,`Sub`关键字表示这是一个子程序,而`以上全选`是宏的名称,可以自定义。 2. **paranum = ...**:这行代码计算当前光标所在段落之前的所有段落数量。`ActiveDocument....

    C语言幻灯片PPT学习教案.pptx

    宏定义有几点需要注意: 1. 宏名通常使用大写字母以区别于变量名。 2. 使用宏可以减少输入和复制复杂的字符串,降低出错概率。 3. 在预处理阶段,宏名的替换是简单的文本替换,不涉及语法检查。因此,如果宏定义中...

    C语言程序设计课件、第7章 编译预处理.ppt

    宏定义的使用需要注意以下几点: * 宏标识符一般使用大写字母表示,以便与程序中的变量相区别。 * 执行预处理命令时只作简单的替换,不进行任何语法检查。 * 宏定义一般放在源程序文件的开始部分,宏标识符只在该...

Global site tag (gtag.js) - Google Analytics