#define str "雖然沒有聲明類型,但是我就是一串字符串"
// 雖然沒有聲明類型,但我就是一個 int 類型的值
#define numForInt 10
int main(void) {
char res[100] = "hello boy ";
// 字符串拼接
// 他不會允許:strcat_s(res , sizeof res , numForInt)
// 很顯然,雖然 numForInt 沒有聲明數(shù)據(jù)類型
// 但程序就把他當(dāng)做成 int 類型了
strcat_s(res , sizeof res , str);
system("pause");
return 0;
}
這邊沒搞清楚 宏 的實際應(yīng)用價值是什么??我感覺他和 變量 的作用是一樣的..,而且相比變量感覺由于沒有聲明數(shù)據(jù)類型,在使用上更加不方便...
請問 宏 的實際應(yīng)用價值是什么??
c 語言的 宏 是自動根據(jù)值來確定類型的??
宏是不帶類型信息的, 只是preprocessor的一個文本替換的, 與之相對的c++的模板則帶有類型信息.
請問 宏 的實際應(yīng)用價值是什么??
簡單的說, 就是文本替換, 只不過基于文本替換可以玩出來些花樣.
#define max(a,b) ((a)<(b)?(b):(a))
, 可以傳int, float等等, 你可以理解為支持了重載, 也可以理解為支持了泛型, 雖然很丑陋233. 再舉個不那么常見的:#define MAKE_PAIR(T) \
typedef struct MAKE_PAIR##T{ \
T first; \
T second; \
} ##T##_pair
MAKE_PAIR(char);
MAKE_PAIR(int);
MAKE_PAIR(float);
這樣就直接定義了多個類型的pair. 也是對泛型的模擬.
我感覺他和 變量 的作用是一樣的..,而且相比變量感覺由于沒有聲明數(shù)據(jù)類型,在使用上更加不方便...
就是不方便呀, 而且不只是缺乏類型, 更重要的是它的scope是dynamic scope, 而不是大家所熟知的lexical scope, 前者的name lookup是在調(diào)用處尋找, 而后者則是在定義處. 這有時候會造成混亂.
能不用的時候就別用
回復(fù)OP的疑問: 你給的這兩個鏈接的說法都不對. inline這個keyword和語義inline本身無關(guān), 你添加了inline其實不會對編譯器有什么影響. 編譯器有自己的判斷. c的inline是c99開始出現(xiàn)的, 貌似是學(xué)c++的. c語言的odr(或者說c其實是沒有odr的, 這里只是代指那套規(guī)則)我不是很熟悉, 不過在c++里面inline關(guān)鍵詞的作用就是屏蔽odr檢查. 和inline的語義(內(nèi)聯(lián))沒有任何關(guān)系. 泛型的話也別看百度百科, 里面問題一大堆. 多搜英文資料. 或者寫寫c++的模板就知道了. 上面那個pair應(yīng)該還是很容易看出泛型在c里面的應(yīng)用的. 不只是primitive type, 其實你自己的結(jié)構(gòu)體也可以這樣很輕松的做出搞出來pair.
宏只是簡單的源代碼文本替換。就是源代碼中所有使用到該宏的地方都被直接替換為宏定義的內(nèi)容。這在編譯前的預(yù)處理階段搞定的。后面的編譯器是看不見宏的。
宏的實際應(yīng)用價值就是輕松執(zhí)行替換啊。
還有就是廣泛應(yīng)用于預(yù)編譯分支控制。就是用在 #if #ifdef #ifndef
等等后面。
==多謝贊同,再補(bǔ)充==
有時候建議使用const變量而不是使用宏來定義這些常量。因為宏真的只是最簡單的幾乎等于文本替換,沒有類型,使用不當(dāng)?shù)倪€可能對使用處的代碼造成別的干擾。比如運(yùn)算符優(yōu)先級等等。
也因為宏僅僅是文本替換,宏后面甚至可以定義大段大段的代碼,比如GTest等使用的各種宏來簡化代碼,在宏里塞個類定義函數(shù)定義什么的。
有興趣可以了解更多的宏使用技巧和注意事項。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。