在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C  C++  網(wǎng)絡(luò)安全/ c 語言的 宏 是自動(dòng)根據(jù)值來確定類型的??

c 語言的 宏 是自動(dòng)根據(jù)值來確定類型的??

#define str "雖然沒有聲明類型,但是我就是一串字符串"
// 雖然沒有聲明類型,但我就是一個(gè) int 類型的值
#define numForInt 10

int main(void) {
    char res[100] = "hello boy ";
    // 字符串拼接
    // 他不會(huì)允許:strcat_s(res , sizeof res , numForInt)
    // 很顯然,雖然 numForInt 沒有聲明數(shù)據(jù)類型
    // 但程序就把他當(dāng)做成 int 類型了
    strcat_s(res , sizeof res , str);

    system("pause");
    return 0;
}

這邊沒搞清楚 的實(shí)際應(yīng)用價(jià)值是什么??我感覺他和 變量 的作用是一樣的..,而且相比變量感覺由于沒有聲明數(shù)據(jù)類型,在使用上更加不方便...

請(qǐng)問 的實(shí)際應(yīng)用價(jià)值是什么??

回答
編輯回答
綰青絲
c 語言的 宏 是自動(dòng)根據(jù)值來確定類型的??

宏是不帶類型信息的, 只是preprocessor的一個(gè)文本替換的, 與之相對(duì)的c++的模板則帶有類型信息.

請(qǐng)問 宏 的實(shí)際應(yīng)用價(jià)值是什么??

原理


簡單的說, 就是文本替換, 只不過基于文本替換可以玩出來些花樣.

實(shí)際應(yīng)用價(jià)值


性能 能省去函數(shù)調(diào)用的開銷, 實(shí)現(xiàn)真正意義上的inline.

實(shí)現(xiàn)泛型與重載 c是不支持這倆貨的, 一定層面, 宏可以實(shí)現(xiàn)其功能, 很經(jīng)典的一個(gè)例子: #define max(a,b) ((a)<(b)?(b):(a)), 可以傳int, float等等, 你可以理解為支持了重載, 也可以理解為支持了泛型, 雖然很丑陋233. 再舉個(gè)不那么常見的:

#define MAKE_PAIR(T) \
  typedef struct MAKE_PAIR##T{ \
       T first; \
       T second; \
  } ##T##_pair 

 MAKE_PAIR(char);
 MAKE_PAIR(int);
 MAKE_PAIR(float);

這樣就直接定義了多個(gè)類型的pair. 也是對(duì)泛型的模擬.

我感覺他和 變量 的作用是一樣的..,而且相比變量感覺由于沒有聲明數(shù)據(jù)類型,在使用上更加不方便...

就是不方便呀, 而且不只是缺乏類型, 更重要的是它的scope是dynamic scope, 而不是大家所熟知的lexical scope, 前者的name lookup是在調(diào)用處尋找, 而后者則是在定義處. 這有時(shí)候會(huì)造成混亂.

什么時(shí)候可以用?

  • 自己瞎玩時(shí)
  • 確定下來真的是某個(gè)函數(shù)是性能瓶頸(這種情況其實(shí)很少出現(xiàn))

什么時(shí)候不該用?

能不用的時(shí)候就別用

Update

回復(fù)OP的疑問: 你給的這兩個(gè)鏈接的說法都不對(duì). inline這個(gè)keyword和語義inline本身無關(guān), 你添加了inline其實(shí)不會(huì)對(duì)編譯器有什么影響. 編譯器有自己的判斷. c的inline是c99開始出現(xiàn)的, 貌似是學(xué)c++的. c語言的odr(或者說c其實(shí)是沒有odr的, 這里只是代指那套規(guī)則)我不是很熟悉, 不過在c++里面inline關(guān)鍵詞的作用就是屏蔽odr檢查. 和inline的語義(內(nèi)聯(lián))沒有任何關(guān)系. 泛型的話也別看百度百科, 里面問題一大堆. 多搜英文資料. 或者寫寫c++的模板就知道了. 上面那個(gè)pair應(yīng)該還是很容易看出泛型在c里面的應(yīng)用的. 不只是primitive type, 其實(shí)你自己的結(jié)構(gòu)體也可以這樣很輕松的做出搞出來pair.

2018年7月13日 17:12
編輯回答
清夢(mèng)

鏈接:宏的講解
這里有很多的用法講解,我常用的情景是多處使用某個(gè)特定值的時(shí)候,我選擇使用宏。這樣修改的時(shí)候,只需要修改一處就能作用到所有需要使用到它的地方,方便修改。

2018年6月30日 19:25
編輯回答
怣痛

宏只是簡單的源代碼文本替換。就是源代碼中所有使用到該宏的地方都被直接替換為宏定義的內(nèi)容。這在編譯前的預(yù)處理階段搞定的。后面的編譯器是看不見宏的。

宏的實(shí)際應(yīng)用價(jià)值就是輕松執(zhí)行替換啊。
還有就是廣泛應(yīng)用于預(yù)編譯分支控制。就是用在 #if #ifdef #ifndef 等等后面。

==多謝贊同,再補(bǔ)充==
有時(shí)候建議使用const變量而不是使用宏來定義這些常量。因?yàn)楹暾娴闹皇亲詈唵蔚膸缀醯扔谖谋咎鎿Q,沒有類型,使用不當(dāng)?shù)倪€可能對(duì)使用處的代碼造成別的干擾。比如運(yùn)算符優(yōu)先級(jí)等等。

也因?yàn)楹陜H僅是文本替換,宏后面甚至可以定義大段大段的代碼,比如GTest等使用的各種宏來簡化代碼,在宏里塞個(gè)類定義函數(shù)定義什么的。

有興趣可以了解更多的宏使用技巧和注意事項(xiàng)。

2018年4月3日 15:59
編輯回答
笑浮塵

首先類型在你說的“值”那里已經(jīng)確定下來了。在你的代碼中
"雖然沒有聲明類型,但是我就是一串字符串"和10,這些是字面常量。真正有類型的是他們,不是str,numForInt 這些符號(hào)。要說有什么實(shí)際應(yīng)用的價(jià)值的話,我沒學(xué)太深,我只知道宏可以用來定義符號(hào)常量,和常變量(const)不同,他不用再占用多一個(gè)某個(gè)類型對(duì)應(yīng)大小的空間,如果代碼中很多地方都用到這個(gè)常量,只需要在定義它的地方修改一次就可以了

2018年2月21日 21:44