亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

#預處理器運算符的應用和需要考慮的問題是什么?

#預處理器運算符的應用和需要考慮的問題是什么?

C
白衣非少年 2019-07-09 13:15:48
#預處理器運算符的應用和需要考慮的問題是什么?正如我在前面的許多問題中提到的,我正在通過K&R進行工作,目前正在進行預處理。有一件更有趣的事情-我以前從任何一次嘗試學習C時都不知道-是##預處理操作符。根據K&R:預處理算子##提供在宏展開期間連接實際參數的方法。如果替換文本中的參數與##參數替換為實際參數,##周圍的空白被移除,結果被重新掃描。例如,宏paste連接它的兩個參數:#define  paste(front, back)  front ## back所以paste(name, 1)創建令牌name1.為什么會有人在現實世界里用這個?它的使用有哪些實際例子,是否有需要考慮的問題?
查看完整描述

3 回答

?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

CrashRpt:使用#將宏多字節字符串轉換為Unicode

CrashRpt(崩潰報告庫)中一個有趣的用法是:

#define WIDEN2(x) L ## x#define WIDEN(x) WIDEN2(x)//Note you need a WIDEN2 so that __DATE__ will evaluate first.

在這里,他們想使用兩個字節的字符串,而不是一個字節的每字符串。這看起來可能是毫無意義的,但他們這么做是有充分理由的。

 std::wstring BuildDate = std::wstring(WIDEN(__DATE__)) + L" " + WIDEN(__TIME__);

它們與返回日期和時間的字符串的另一個宏一起使用它。

L緊挨著__ DATE __會給你一個編譯錯誤。


Windows:對通用Unicode或多字節字符串使用#

Windows使用如下所示:

#ifdef  _UNICODE    #define _T(x)      L ## x#else
    #define _T(x) x#endif

_T在代碼中到處使用。


用于清潔訪問器和修飾符名稱的各種庫:

我還在代碼中看到它用于定義訪問器和修飾符:

#define MYLIB_ACCESSOR(name) (Get##name)#define MYLIB_MODIFIER(name) (Set##name)

同樣,您也可以在任何其他類型的聰明的名稱創建中使用相同的方法。


各種庫,使用它同時進行多個變量聲明:

#define CREATE_3_VARS(name) name##1, name##2, name##3int CREATE_3_VARS(myInts);myInts1 = 13;myInts2 = 19;myInts3 = 77;


查看完整回答
反對 回復 2019-07-09
  • 3 回答
  • 0 關注
  • 381 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號