C语言第十三章:宏定义条件编译头文件

Posted 歌咏^0^

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言第十三章:宏定义条件编译头文件相关的知识,希望对你有一定的参考价值。

目录

一、宏定义

二、条件编译

三、头文件


一、宏定义

        1、概念:#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本

                #define HELLO    "hello world\\n"
                #define PI      3.14

                #define A(a,b,c)  ({a=1;b+=1;c=3;a+b+c;}) 

        2、作用
               进行简单的代码替换,提高程序的可读性
        3、格式:
            1)简单的宏定义:
                #define    <宏名>    <字符串>
            2)带参数的宏定义(宏函数
                #define    <宏名>(参数表)    <宏体>
                比如:#define    A(x)    
                           #define A(a,b,c)  ({a=1;b+=1;c=3;a+b+c;}) 
    
            3)    #define  xxx()     ({}) 
    
        4、好处
            方便程序的修改,提高程序的可读性


        5、注意
                在简单宏定义的使用中,当替换文本所表示的字符串为一个表达式时,容易引起误解和误用。
                #define   N   2+2 --注意 #define   N   (2+2)   

                #define   N   2+2
                void main()
                {
                   int   a=N*N;
                   printf(“%d”,a);
                }

                ===
                #include<stdio.h>

                #define Calc(a,b,c)    ({a++;b++;c++;a+b+c;})

                /* int Calc(int a,int b,int c)
                {
                    a++;
                    b++;
                    c++;
    
                    return a+b+c;
                } */

                int main()
                {
                    int a=10;
                    int b=20;
                    int c=30;
    
                    int ret = Calc(a,b,c);
    
                    printf("ret:%d\\n",ret);
    
                    return 0;
                }

        内联函数与宏定义的区别:
                1)内联函数在编译时展开,而在预处理时展开;在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。
                2)内联函数可以进行诸如类型安全检查、语句是否正确等编译功能,宏不具有这样的功能;宏不是函数,而inline是函数
                3)宏在定义时要小心处理宏参数,一般用括号括起来,否则容易出现二义性。而内联函数不会出现二义性
                4)inline有点类似于宏定义,但是它和宏定义不同的是,宏定义只是简单的文本替换,是在预编译阶段进行的。而inline的引入正是为了取消这种复杂的宏定义的。

                #define MAX(a,b) ((a)>(b)?(a):(b))
                MAX(a,"Hello"); //错误地比较int和字符串,没有参数类型检查
----------------------------------------------------------

#include <stdio.h>
 
inline int add(int a, int b)
{
    return (a + b);
}
 
int main(void)
{
    int a;
 
    a = add(1, 2);
    printf("a+b=%d\\n", a);
 
    return 0;
}
以上a = add(1, 2);处在编译时将被展开为:
a = (a + b);
---------------------------------------------------------

二、条件编译

        概念:能够根据不同情况编译不同代码,产生不同目标文件的机制,称之为条件编译。说白了,条件编译的意思就是有条件地编译某些我们指定的代码,而不一定编译文件中所有的代码。

        1、#if命令
                #if 整型常量表达式1
                    程序段1
                #elif 整型常量表达式2
                    程序段2
                #elif 整型常量表达式3
                    程序段3
                #else
                    程序段4
                #endif

                比如:
                #if  0  ---相当于注释作用

                #endif

      2、#ifdef 命令

                #ifdef  宏名
                    程序段1
                #else 
                    程序段2
                #endif
                --------
                #ifdef   宏名
                    程序段
                #endif
                --------
                #ifndef  宏名
                    程序段1
                #else
                    程序段2
                #endif
                ===========
                #include<stdio.h>

               //#define SELECT

                int main()
                {

                #ifdef SELECT
                    int a = 100;
                    int b = 300;
                    int c = 500;
                    printf("SELECT\\n");
                    printf("a:%d b:%d c:%d\\n",a,b,c);
    
                #else
                    int a = 1000;
                    int b = 3000;
                    int c = 5000;
                    printf("SELECT\\n");
                    printf("a:%d b:%d c:%d\\n",a,b,c);
    
                #endif
    
                    return 0;
                }
                ========
        3、使用宏定义调试语句
                #include<stdio.h>

                int main(void)
                {
                    #ifdef DEBUG
                        printf("传入参数\\n");
                    #else
                        printf("没有传入参数\\n");
                    #endif
    
                    return 0;
                }
                在编译的时候加入 -DDEBUG

                编译命令:gcc if.c -o  if  -DDEBUG

三、头文件

        #ifndef    __HEAD_H_
        #define   __HEAD_H_

        //头文件

        //函数声明

        //全局变量定义

        #endif

以上是关于C语言第十三章:宏定义条件编译头文件的主要内容,如果未能解决你的问题,请参考以下文章

预处理三剑客(宏定义,文件包含和条件编译)之第三种——条件编译。 #ifndef #ifdef

c语言中怎么用命令提示窗口编译宏定义并打印出来!请指教.谢谢了.

如何在Makefile中定义宏进行条件编译

C 语言中#if 0

C-宏定义, 预处理, 条件编译

十预处理