使用法Cプリプロセッサディレクティブの#defineの#ifdef #ifndefの#ifdefined()の#if!定義()#endifの

次のように本論文では、C / C ++プリプロセスの手順、一般的な前処理指令を記録します。

1、#は、定義されたマクロを定義します
(1)最大数3を求めてマクロ定義を三項演算子を使用して

個人間でのインタビューで一度尋ねられ、ブラケットの最外層に注意を払うが、失うことはありません

#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、#与えられた条件が真の場合、コンパイラのコードの下であれば
図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 0
///< 旧的代码(或函数) (旧的代码, 将会被预处理的时候,屏蔽掉, 不进行编译)
#else
///< 新的代码(或函数)
#endif
 
#ifndef JOE_DEBUG
///< 新的代码(或函数)
#else
///< 旧的代码(或函数) (旧的代码, 将会被预处理的时候,屏蔽掉, 不进行编译)
#endif
 
#ifdef Q_DEBUG
///< 新的代码(或函数)
#else
///< 旧的代码(或函数) (旧的代码, 将会被预处理的时候,屏蔽掉, 不进行编译)
#endif
8、#エラーがコンパイルし、エラーメッセージを表示を停止します

プロジェクトのソースコードは、マクロの確立のための条件、マクロ問題や衝突を確実にするために、非常に大きい場合、#エラーがコンパイル時エラーに進みます

// 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 

直接コンパイル時に次のエラーメッセージが生じるような

「メイン」関数では:
:36:2:エラー:#エラー「MACROは終了していません」

エラーは、「マクロが終了していません」

^ ~~~~

9、#あなたがマクロがマクロの真と偽に関係なく、コンパイルされている定義した場合)(定義されている場合

問題の#if定義されたロジック「x」の内側、コンパイラ、このマクロのxを定義した場合、それは単にプログラムのマクロ定義の前に「X」のない定義は、このマクロはありません「true」または「false」ではありませんこれは、そうでない場合は、直接...コード...コードの真ん中を見落としていない... ...コードの真ん中をコンパイルします。

#if defined (x)
    ...code...
#endif

== ==注:定義は単にコードのマクロブロックがコンパイルされるかどうかを決定します

10、#もし!回避重複するために定義された)(定義
#if !defined(__TARGET_CONFIG_H__)
#define __TARGET_CONFIG_H__

#endif //__TARGET_CONFIG_H__
////EOF/////////

おすすめ

転載: www.cnblogs.com/muziyu/p/12346188.html