本文主要记录了C/C++预处理指令,常见的预处理指令如下:
1、#define定义宏
(1)宏定义运用三目运算符求三个数的最大数
个人曾经在面试当中被问到,注意最外面一层括号不要丢
#define MAX1(a,b,c) ((a)>(b)?(a>c?a:c):(b>c?b:c))
#define MAX2(a,b,c) (((a)>(b)?a:b)>c?((a)>(b)?a:b):c)
(2)宏参数的连接
#include <stdio.h>
#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
*/
(3)用宏定义得到一个数组所含元素的个数
#define ARR_SIZE(a) (sizeof((a))/sizeof((a[0])))
(4)用宏得到一个字的高位或低位的字节
#define WORD_LO(xxx) ((byte)((word)(xxx) & 255))
#define WORD_HI(xxx) ((byte)((word)(xxx) >> 8))
/*
* 一个字(word)2个字节,获得低字节(低8位),与255(0000,0000,1111,1111)按位相与
* 获得高字节(高8位),右移8位即可。
*/
2、#undef取消已定义的宏
3、#if如果给定条件为真,则编译下面代码
4、#ifdef如果宏已经定义,则编译下面代码
5、#ifndef如果宏没有定义,则编译下面代码
在头文件中防止重复定义
#ifndef _USB_DEVICE_CONFIG_H_
#define _USB_DEVICE_CONFIG_H_
#endif //_USB_DEVICE_CONFIG_H_
6、#elif如果前面的#if给定条件不为真,当前条件为真, 则编译下面代码
//usage1
#ifdef MACRO1
/*--CODE1--*/
#elif MACRO2
/*--CODE2--*/
#endif
//usage2
#ifdef MACRO1
/*--CODE1--*/
#elif MACRO2
/*--CODE2--*/
#else
/*--CODE3--*/
#endif
7、#endif结束一个#if……#else条件编译块
下面的宏编译块常用来做代码块调试,为了不删除旧的调试代码去删除它
#if 0
///< 旧的代码(或函数) (旧的代码, 将会被预处理的时候,屏蔽掉, 不进行编译)
#else
///< 新的代码(或函数)
#endif
#ifndef JOE_DEBUG
///< 新的代码(或函数)
#else
///< 旧的代码(或函数) (旧的代码, 将会被预处理的时候,屏蔽掉, 不进行编译)
#endif
#ifdef Q_DEBUG
///< 新的代码(或函数)
#else
///< 旧的代码(或函数) (旧的代码, 将会被预处理的时候,屏蔽掉, 不进行编译)
#endif
8、#error停止编译并显示错误信息
在项目源码很庞大时,为了保证某个宏条件成立,或者宏冲突等问题,#error就会在编译时提前报错
// Determine whether to support MMC/eMMC
//支持MMC但是没有MMC模块就会编译报错
#define BL_FEATURE_MMC_MODULE (1)
#if BL_FEATURE_ENABLE_MKBOOT_DEVICE_MMC && !BL_FEATURE_MMC_MODULE
#error "'BL_FEATURE_ENABLE_MKBOOT_DEVICE_MMC' requires 'BL_FEATURE_MMC_MODULE'"
#endif
# -*- coding:utf-8 -*-
/*如果没有定义MACRO这个宏,那么编译就报错直接结束*/
#ifndef MACRO
#error "MACRO is not exits"
#endif
编译时直接发生诸如下面的报错信息
In function 'main':
:36:2: error: #error "MACRO is not exits"error "MACRO is not exits"
^~~~~
9、#if defined()如果定义了某个宏则编译,不管宏的真假
这个#if defined它不管里面的“x”的逻辑是“真”还是“假”它只管这个程序的前面的宏定义里面有没有定义“x”这个宏,如果定义了x这个宏,那么,编译器会编译中间的…code…否则不直接忽视中间的…code…代码。
#if defined (x)
...code...
#endif
==注==:宏定义只是决定代码块是否被编译
10、#if !defined()为了避免重复定义
#if !defined(__TARGET_CONFIG_H__)
#define __TARGET_CONFIG_H__
#endif //__TARGET_CONFIG_H__
////EOF/////////