点击左上方蓝色“混说Linux”,选择“设为星标”
很多优秀的代码,都会借用预编译指令来完善代码,今天就来讲讲关于预编译指令的内容。
#
指令,无任何效果#include
含一个源代码文件#define
义宏#undef
消已定义的宏#if
果给定条件为真,则编译下面代码#ifdef
果宏已经定义,则编译下面代码#ifndef
果宏没有定义,则编译下面代码#elif
果前面的if
定条件不为真,当前条件为真,则编译下面代码#endif
束一个if……#else
件编译块#error
止编译并显示错误信息什么是预处理指令?
#include
#include "test.h"
#include
#define MAX(x,y) (((x)>(y))?(x):(y))
#define MIN(x,y) (((x)<(y))?(x):(y))
int main(void)
{
#ifdef MAX //判断这个宏是否被定义
printf("3 and 5 the max is:%d\n",MAX(3,5));
#endif
#ifdef MIN
printf("3 and 5 the min is:%d\n",MIN(3,5));
#endif
return 0;
}
/*
* (1)三元运算符要比if,else效率高
* (2)宏的使用一定要细心,需要把参数小心的用括号括起来,
* 因为宏只是简单的文本替换,不注意,容易引起歧义错误。
*/
#include
#define SQR(x) (x*x)
int main(void)
{
int b=3;
#ifdef SQR//只需要宏名就可以了,不需要参数,有参数的话会警告
printf("a = %d\n",SQR(b+2));
#endif
return 0;
}
/*
*首先说明,这个宏的定义是错误的。并没有实现程序中的B+2的平方
* 预处理的时候,替换成如下的结果:b+2*b+2
* 正确的宏定义应该是:#define SQR(x) ((x)*(x))
* 所以,尽量使用小括号,将参数括起来。
*/
#include
#define STR(s) #s
#define CONS(a,b) (int)(a##e##b)
int main(void)
{
#ifdef STR
printf(STR(VCK));
#endif
#ifdef CONS
printf("\n%d\n",CONS(2,3));
#endif
return 0;
}
/* (绝大多数是使用不到这些的,使用到的话,查看手册就可以了)
* 第一个宏,用#把参数转化为一个字符串
* 第二个宏,用##把2个宏参数粘合在一起,及aeb,2e3也就是2000
*/
#include
#define WORD_LO(xxx) ((byte)((word)(xxx) & 255))
#define WORD_HI(xxx) ((byte)((word)(xxx) >> 8))
int main(void)
{
return 0;
}
/*
* 一个字2个字节,获得低字节(低8位),与255(0000,0000,1111,1111)按位相与
* 获得高字节(高8位),右移8位即可。
*/
#include
#define ARR_SIZE(a) (sizeof((a))/sizeof((a[0])))
int main(void)
{
int array[100];
#ifdef ARR_SIZE
printf("array has %d items.\n",ARR_SIZE(array));
#endif
return 0;
}
/*
*总的大小除以每个类型的大小
*/
#include
#include
#define DEBUG
int main(void)
{
int i = 0;
char c;
while(1)
{
i++;
c = getchar();
if('\n' != c)
{
getchar();
}
if('q' == c || 'Q' == c)
{
#ifdef DEBUG//判断DEBUG是否被定义了
printf("We get:%c,about to exit.\n",c);
#endif
break;
}
else
{
printf("i = %d",i);
#ifdef DEBUG
printf(",we get:%c",c);
#endif
printf("\n");
}
}
printf("Hello World!\n");
return 0;
}
/*#endif用于终止#if预处理指令。*/
#include
#define DEBUG
main()
{
#ifdef DEBUG
printf("yes ");
#endif
#ifndef DEBUG
printf("no ");
#endif
}
//#ifdefined等价于#ifdef;
//#if!defined等价于#ifndef
#else指令
#elif指令
其他一些指令
#error
指令将使编译器显示一条错误信息,然后停止编译。#line
指令可以改变编译器用来指出警告和错误信息的文件号和行号。#pragma
令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。往期推荐