1.定義
預(yù)處理命令是c++統(tǒng)一規(guī)定的,但是它不是c++語言本身的組成部分坞嘀,不能直接對(duì)他們進(jìn)行編譯
2.預(yù)處理的分類
2.1 宏定義 #typeof
#typeof IS_DEBUG true
2.2 文件包含 #include
#include<android/log.h> #include<string>
是指一個(gè)源文件可以將另外一個(gè)源文件的全部內(nèi)容包含進(jìn)來,也就是將另外的文件包含到本文件之中
#include <文件名> 在系統(tǒng)目錄中尋找
#include "文件名" 現(xiàn)在指定目錄去尋找,然后再去系統(tǒng)目錄找糠悼,如果沒有給出絕對(duì)路徑堪藐,則現(xiàn)在用戶當(dāng) 前目錄去尋找
C的標(biāo)準(zhǔn)庫加.h莉兰,c++標(biāo)準(zhǔn)庫可以不加.h
2.3.條件編譯 #ifndefine
#ifndef LOG_TAG #define LOG_TAG "JNI" #endif #ifndef IS_DEBUG #define IS_DEBUG true #endif
#ifndef標(biāo)識(shí)符 字符串
#define 標(biāo)識(shí)符 字符串
#define 命令定義參數(shù)的宏定義
#define 宏名(參數(shù)表) 字符串
以上兩種用法由于常量的定義以及增加的內(nèi)置函數(shù)更加方便,所以現(xiàn)在#define命令多見于條件編譯中
#ifndef
#ifdef 標(biāo)識(shí)符 當(dāng)指定的標(biāo)識(shí)符已經(jīng)被#define命令定義過礁竞,
程序段1 則只編譯程序段1
#else 否則
程序段2 編譯程序段2
#endif 限定#ifdef命令的范圍
#if 表達(dá)式 表達(dá)式為真時(shí)
程序段1 編譯程序段1
#else 否則
程序段2 編譯程序段2
#endif 結(jié)束#if命令
2.4一個(gè)完整的例子如下:
#include "android/log.h" #ifndef LOG_TAG #define LOG_TAG "JNI" #endif #ifndef IS_DEBUG #define IS_DEBUG true #endif #define LOG_NOOP (void) 0 //__FILE__ 輸出文件名 //__LINE__ 輸出行數(shù) // __PRETTY_FUNCTION__ 輸出方法名 //可以按需選取 %s %u %s 分別與之對(duì)應(yīng) #define LOG_PRINT(level, fmt, ...) __android_log_print(level,LOG_TAG,"(%s:%u) %s: " >fmt,__FILE__,__LINE__,__PRETTY_FUNCTION__,##__VA_ARGS__) //通過IS_DEBUG來控制是否輸出日志 #if IS_DEBUG #define LOGI(fmt, ...) LOG_PRINT(ANDROID_LOG_INFO,fmt,##__VA_ARGS__) #else #define LOGI(...) LOG_NOOP #endif #if IS_DEBUG #define LOGW(fmt, ...) LOG_PRINT(ANDROID_LOG_WARN,fmt ,##__VA_ARGS__) #else #define LOGW(...) LOG_NOOP #endif #if IS_DEBUG #define LOGD(fmt, ...) LOG_PRINT(ANDROID_LOG_DEBUG,fmt ,##__VA_ARGS__) #else #define LOGD(...) LOG_NOOP #endif #if IS_DEBUG #define LOGE(fmt, ...) LOG_PRINT(ANDROID_LOG_ERROR,fmt ,##__VA_ARGS__) #else #define LOGE(...) LOG_NOOP #endif #if IS_DEBUG #define LOGF(fmt, ...) LOG_PRINT(ANDROID_LOG_FATAL,fmt ,##__VA_ARGS__) #else #define LOGF(...) LOG_NOOP #endif
3.常用預(yù)定義宏
__LINE__: 當(dāng)前源文件的行號(hào)糖荒,整數(shù)
__FILE__: 當(dāng)前源文件名,char 字符串模捂,使用 /FC 選項(xiàng)產(chǎn)生全路徑
__DATE__: 當(dāng)前編譯日期捶朵,char 字符串,格式 月 日 年
__TIME__: 當(dāng)前編譯時(shí)間狂男,char 字符串综看,格式 時(shí):分:秒
__STDC__: 整數(shù) 1,表示兼容 ANSI/ISO C 標(biāo)準(zhǔn)岖食,配合 #if 使用
__TIMESTAMP__: 最后一次修改當(dāng)前文件的時(shí)間戳红碑,char 字符串,格式 星期 月份 日期 時(shí):分:秒 年