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