導航:首頁 > 源碼編譯 > 添加預編譯宏處理

添加預編譯宏處理

發布時間:2023-03-27 22:48:15

A. 什麼是預編譯,何時需要預編譯

預編譯又稱為預處理,是做些代碼文本的替換工作

預編譯又稱為預處理,是做些代碼文本的替換工作

處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等

就是為編譯做的預備工作的階段

主要處理#開始的預編譯指令

預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。常見的預編譯指令有:

(1)#include 指令

該指令指示編譯器將xxx.xxx文件的全部內容插入此處。若用<>括起文件則在系統的INCLUDE目錄中尋找文件,若用" "括起文件則在當前目錄中尋找文件。一般來說,該文件是後綴名為"h"或"cpp"的頭文件。

注意:<>不會在當前目錄下搜索頭文件,如果我們不用<>而用""把頭文件名擴起,其意義為在先在當前目錄下搜索頭文件,再在系統默認目錄下搜索。

(2)#define指令

該指令有三種用法:

第一種是定義標識,標識有效范圍為整個程序,形如#define XXX,常與#if配合使用;

第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見注1);

第三種是定義"函數",如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見注2)。

第四種是定義"宏函數",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用時,用GEN_FUN(int),則此處預編譯後就變成了 max_int(int a,int b){return a>b?a:b;},以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了類型的說明。

(3)#if、#else和#endif指令

這些指令一般這樣配合使用:

#if defined(標識) //如果定義了標識

要執行的指令

#else

要執行的指令

#endif

在頭文件中為了避免重復調用(比如說兩個頭文件互相包含對方),常採用這樣的結構:

#if !(defined XXX) //XXX為一個在你的程序中唯一的標識符,

//每個頭文件的標識符都不應相同。

//起標識符的常見方法是若頭文件名為"abc.h"

//則標識為"abc_h"

#define XXX

真正的內容,如函數聲明之類

#endif

B. 預處理命令的宏定義

1.不帶參數的宏定義:
宏定義又稱為宏代換、宏替換,簡稱「宏」。
格式:
#define標識符文本
其中的標識符就是所謂的符號常量,也稱為「宏名」。
預處理(預編譯)工作也叫做宏展開:將宏名替換為文本(這個文本可以是字元串、可以是代碼等)。
掌握宏概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,准確理解之前就要「換」。
即在對相關命令或語句的含義和功能作具體分析之前就要換:
例:
#define PI 3.1415926
把程序中全部的標識符PI換成3.1415926
說明:
(1)宏名一般用大寫
(2)使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:數組大小常用宏定義
(3)可以用#undef命令終止宏定義的作用域
(4)宏定義可以嵌套
2.帶參數的宏:
除了一般的字元串替換,還要做參數代換
格式:
#define 宏名(參數表)文本
例如:#define S(a,b) a*b
area=S(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2;
類似於函數調用,有一個啞實結合的過程:
(1)實參如果是表達式容易出問題
#define S(r) r*r
area=S(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b;
正確的宏定義是#define S(r) ((r)*(r))
(2)宏名和參數的括弧間不能有空格
(3)宏替換只作替換,不做計算,不做表達式求解
(4)函數調用在編譯後程序運行時進行,並且分配內存。宏替換在編譯前進行,不分配內存
(5)宏的啞實結合不存在類型,也沒有類型轉換。
(6)宏展開使源程序變長,函數調用不會
(7)宏展開不佔運行時間,只佔編譯時間,函數調用占運行時間(分配內存、保留現場、值傳遞、返回值)

C. 怎麼在NDK的makefile加入預編譯宏

一個程序使用宏:在代碼中定義,在編譯器編譯的時候指定。所謂的makefile只是一個編譯系統,最終還是調用編譯器。
對於你的問題,在NDK的makefile中加入宏定義,換種說法是:如何給NDK的makefile添加編譯選項,有一個LOCAL_CFLAGS就可以定義選項了(或許還有其他的xxxcflags的東西定義,具體就自己查手冊)。
加入選項,如:-DMyMacro

ifeq ($(HOST_OS),linux)
LOCAL_CFLAGS := -DGCC
endif
lz要的是在這個嗎

D. 怎麼樣為一個xcode的工程添加一個預編譯的宏

C++builder是最快的C++編譯器之一,從編譯速度來說也可以說是最快的win32C++編譯器了。除了速度之外,C++builder的性能也在其它C++編譯器的之上,但許多delphi程序員仍受不了c++builder工程的編譯速度。的確,delphi的速度要比任和c++的編譯器都要快好多。Delphi在編譯一個小工程的時候可能不到一秒,大的工程一般也在5秒鍾這內編譯完成了。

E. C語言提供的預編譯處理命令主要有哪三種

1.宏定義:用一個指定的標識符(即名字)來代表一個字元串,如:用PI代表3.1415926,#define PI 3.1415926
2.文件包含:指一個源文件可以將另外一個源文件的全部內容包含進來,#include<文件名>
3.條件編譯:對一部分內容指定編譯的條件,即滿足一定的條件才編譯,主要有:
(1)#ifdef標識符
程序段1
#eles
程序段2
#endif
(2)#ifndef標識符
程序段1
#eles
程序段2
#endif
(3))#if標識符
程序段1
#eles
程序段2
#endif

F. vs2008添加預編譯命令

以預編譯頭文件為Stdafx.h為例:
Qt Creator中很簡單,只需在.pro文件中加入一行PRECOMPILED_HEADER = stdafx.h
VS2008在工程中在Stdafx.h文件上右鍵propertis-Configuration Properties-C/C++-Precompiled Headers-Create/Use Precompiled Header中選擇Create Precompiled Header(/y).
有一點注意的是,在工程Generated Filed中的moc相關文件也需要選上Use Precompiled Header (/Yu).

G. word中錄制新宏的具體操作步驟是什麼

材料/工具:word2010

1、打開一個word文檔,而後在文檔中輸入文字,並選中而後在上方功能區找到開發工具菜單

H. ios cocoapods怎麼添加預編譯宏

ALT+F11打開VBE編輯器,將代碼放進去,運行(單擊工具----宏---宏找到這代碼的名字運行就可以了)

I. 不支持的sdk調用怎麼辦

剛才說了,出現在這種問題是集成了第三方的SDK,該SDK不支持模擬器運行。其實,再問題具體一點,是因為這類SDK不支持在x86下編譯的話,則不能在模擬橡櫻虛器上調試運行。
二、解決這種問題的思路。
  其實,解決這類問題的方法就是四個字:條件編譯。利用條件編譯,在梁燃模擬器環境下不對不支持x86的SDK進行編譯即可。
  對於有些SDK提供了兩套版本,一套Release環境,一套Debug環境。Debug環境支持在模擬器進行,對於這類SDK,則可以通過替換SDK的framework的方式來解決模擬器調試問題。比如阿里雲短視頻SDK,七牛視頻播放SDK等等。
三、具體解決問題的方法。
  我們要設置一個預編譯宏,來處理條件編譯,比如設置一個預編譯宏,名字叫EZDISABLE。在Target的Build Settings選項卡下面,我們找到Preprocessor Macros項,雙擊後增加一項:EZDISABLE=1。可以只在Debug或者只在Release加入該宏,具體依據你自己的需求而定。這里我都加入了。
  下面,就是將用到不支持x86的SDK的調用,通過EZDISABLE宏「隔離」開。在我這個項目中,需要把螢石雲的SDK「隔離」。
  代碼可能分散的比較多,需要耐心的一個個把他給去掉。
  上面還說了,有些SDK分Release和Debug兩個版本,Debug支持模擬器編譯。對於這類,如果你的SDK是通過手工添加的方式來集成的話,那你就手工一個個一個把SDK給替換了,如果你用的是cocoaPods的話,那一般只需要將Podfile的引用稍作修改既可以。我這個用的是cocoaPods來集成的七牛視頻播放SDK。我將Podfile文件修改成下面的即可:
  有時候,我們為了方便代碼的復用,做了很多的私有Pod子庫提供給主項目集成。如果在這些私有庫中引用了類似七牛這種SDK該怎麼辦?其實我們根據cocoaPods的規則,完全可以不用考慮子庫,直接在主工程的Podfile文件將SDK的引用改了就行。cocoaPods會自動處理這類依賴,非常方便。
四、問題優化。
  在上面,已經基本上解決了如何在模擬器上編譯的問題。但是不太方便,我們總不能每次切換真機與模擬器的時候,都去修改一下預編譯宏和Podfile文件吧?
  具體該怎麼進行優化可以讓我們方便的切換調試環境呢?
  對於預編譯宏的設置,我們可以通過再設置一個Target的方式來處理,我們將工程的Target復制一個,比如原工程Target名字為:BBTSer。復制的一個改名為:BBTSer Simulator。我們只在BBTSer Simulator的Build Settings選項卡中的Preprocessor Macros增加預編譯宏EZDISABLE=1。原來的老Target不變。如果用cocoaPods的話,在增加了一個新的Target後要相應的修改一下Podfile文件來增加對這個Target的支持。這樣,就可以通過切換Target的方式來處理真機與模擬器的調試切換。
  再說下Podfile文件的優化。上面講了,對於七牛的SDK官方支持了在模擬器調試,但是是不同的pod庫地址。需要進行切換。那麼我們如何能夠使cocoaPod能夠以一種相對自動的方式來處理這種切換呢?這需要我們更加的了解Podfile的語法才行。首先,在上面我們建立了兩個Target。所以Podfile文件要同時處理兩個Target的集成。然後,對於不同的Target有可能要集成不同的七牛SDK地址,如何在pod install的時候來處理這種不同?
  對於第一個問題其實很簡單,網路一下很多方式,這里不在敘述。對於第二個問題需要說一下。在Podfile中,如果兩個或者多個Target引頌亂用了相同的pod庫,但是源文件地址不一樣的話,是會報錯的。那麼我們就需要增加一個開關來處理一下,如果開關打開,則引入正常地址,如果開關關閉則引入另外一個地址。我們知道,Podfile文件的語法其實跟Ruby差不多。所以,我們可以增加一個變數release,然後通過判斷release變數是false還是true來引入不同的源地址。這樣,我們的Podfile文件就變成了如下行使。
source'https://github.com/CocoaPods/Specs.git'platform:ios,'8.0'inhibit_all_warnings!#開關變數release=false# abstract_target:抽象target。內部包含兩個Target:BBTSer和BBTSer Simulator。這兩個Targe繼承這個抽象target。抽象target的名字可以隨意定義,這里我定義成BBTabstract_target'BBT'do......ifreleasethentarget'BBTSer'dopod"PLPlayerKit"endelsetarget'BBTSer Simulator'dopod"PLPlayerKit",:podspec=>'https://raw.githubusercontent.com/pili-engineering/PLPlayerKit/master/PLPlayerKit-Universal.podspec'endendend
到了這里,我們在每次切換模擬器和真機的時候,只要把release的狀態改一下就可以了,真機改成true,模擬器改成false。然後在pod install或者pod update。你可能會說,這樣也不好。每次還要改Podfile文件。那麼好,我再加一個shell腳本,來幫著我們處理這個改動,不要每次都改Podfile文件了,省的不小心改錯了。shell文件起名為podinstall.sh。內容如下:
#!/bin/bash file="Podfile" if [ ! -f "$file" ]; then echo '沒有找到Podfile文件' exit fi if [ ! -n "$1" ] ;then echo "請輸入參數。真機調試以及發布到AppStore請輸入release,模擬器調試輸入debug" exit fi MODE=$1 if [ "$MODE" != "release" ] && [ "$MODE" != "debug" ];then echo "請輸入正確的參數。真機調試以及發布到AppStore請輸入release,模擬器調試輸入debug" exit fi echo "當前集成環境:$MODE" podmodel="release=false" if [ "$MODE" == "release" ];then podmodel="release=true" fi echo $podmodel # sed -i "s/release=true/$podmodel/g" # sed -i '' '/release=true/$podmodel/g' $file sed -i '' "s#release=true#$podmodel#g" $file sed -i '' "s#release=false#$podmodel#g" $file #更新pod配置 echo "********************************************" echo "* 配置完畢,開始Pod集成 *" echo "********************************************" pod install

閱讀全文

與添加預編譯宏處理相關的資料

熱點內容
python協程線程 瀏覽:293
周立功單片機資料 瀏覽:327
程序員大神級演講 瀏覽:286
飛思卡爾單片機培訓 瀏覽:403
解壓神器音樂盒秘密 瀏覽:542
韓國電影愛情推理片劇情 瀏覽:185
江西調度伺服器掛式雲空間 瀏覽:13
vip韓國電視劇李鍾碩 瀏覽:934
stc15單片機驅動步進電機 瀏覽:122
一個壞媽媽金珠 瀏覽:806
申請農業銀行信用卡用什麼app 瀏覽:187
在線看的網站 瀏覽:696
金碟專業版的伺服器如何啟動 瀏覽:404
谷輪壓縮機上海 瀏覽:726
兩對情侶互換的電影 瀏覽:347
linux的解壓gz命令 瀏覽:377
排序演算法的測試用例 瀏覽:411
linux終端編碼 瀏覽:141
程序員決定去擺攤 瀏覽:213
戰術手語圖解命令手語 瀏覽:58