C预处理指令用法#define #ifdef #ifndef #ifdefined() #if !defined() #endif

本文主要记录了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/////////

猜你喜欢

转载自www.cnblogs.com/muziyu/p/12346188.html