C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- æºæä»¶å å«
- æ¡ä»¶å å«
- ææ¬æ¿æ¢å®
- é误æä»¤
- å®ç°å®ä¹çè¡ä¸ºæ§å¶
- æä»¶ååè¡ä¿¡æ¯
- 注é
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >é¢å¤çå¨ > ææ¬æ¿æ¢å®
ææ¬æ¿æ¢å®
é¢å¤ç卿¯æææ¬å®æ¿æ¢ãäº¦æ¯æä»¿å½æ°ææ¬å®æ¿æ¢ã
è¯æ³
#define æ è¯ç¬¦ æ¿æ¢å表(å¯é)
|
(1) | ||||||||
#define æ è¯ç¬¦( å½¢å ) æ¿æ¢å表(å¯é)
|
(2) | ||||||||
#define æ è¯ç¬¦( å½¢å, ... ) æ¿æ¢å表(å¯é)
|
(3) | (C++11 èµ·) | |||||||
#define æ è¯ç¬¦( ... ) æ¿æ¢å表(å¯é)
|
(4) | (C++11 èµ·) | |||||||
#undef æ è¯ç¬¦
|
(5) | ||||||||
è§£é
#define æä»¤
#define æä»¤å° æ è¯ç¬¦ å®ä¹ä¸ºå®ï¼å³æç¤ºç¼è¯å¨ä»¥å°å
¶ååºç°çææ æ è¯ç¬¦ 齿¿æ¢ä¸º æ¿æ¢å表ï¼èå®ä¹å¯ä»¥è¢«è¿ä¸æ¥å¤çãè¥è¯¥æ è¯ç¬¦å·²è¢«å®ä¹ä¸ºä»»ä½ç±»åçå®ï¼åé¤éè¿äºå®ä¹é½ç¸åï¼å¦åç¨åºéè¯æã
仿对象å®
仿对象å®ï¼object-likeï¼ä»¥ æ¿æ¢å表 æ¿æ¢æ¯æ¬¡åºç°ç被å®ä¹ æ è¯ç¬¦ã#define æä»¤ççæ¬ (1) å确表ç°å¦æ¤ã
ä»¿å½æ°å®
ä»¿å½æ°å®ï¼function-likeï¼ä»¥ æ¿æ¢å表 æ¿æ¢æ¯æ¬¡åºç°ç被å®ä¹ æ è¯ç¬¦ï¼å¯éå°æ¥åä¸å®éçå®åï¼å®ä»¬é峿¿æ¢æ æ¿æ¢å表 ä¸åºç°çä»»ä½å¯¹åºç å½¢åã
ä»¿å½æ°å®è¯æ³ç±»ä¼¼å½æ°è°ç¨è¯æ³ï¼æ¯ä¸ªå®åå®ä¾åéä¸ä¸ª ( ä½ä¸ºä¸ä¸ªé¢å¤çè®°å·ï¼æå¼å ¥çè®°å·åºåå°è¢«æ¿æ¢ä¸º æ¿æ¢å表ã该åºå以å¹é ç ) è®°å·ç»æ¢ï¼è·³è¿ä¸é´çå¹é 左峿¬å·å¯¹ã
对äºçæ¬ (2)ï¼å®åæ°éå¿
é¡»ä¸å®å®ä¹ä¸ç形忰éç¸åã对äºçæ¬ (3,4) ï¼å®åæ°éå¿
é¡»å¤äº (C++20 å)ä¸å°äº (C++20 èµ·)形忰éï¼ä¸è®¡ ...ï¼ãå¦åç¨åºéè¯æãè¥æ è¯ç¬¦æªä½¿ç¨å½æ°åæ³ï¼å³å®èªèº«ä¹åæ æ¬å·ï¼åå®å®å
¨ä¸è¢«æ¿æ¢ã
#define æä»¤ççæ¬ (2) å®ä¹ç®åä»¿å½æ°å®ã
#define æä»¤ççæ¬ (3) å®ä¹æå¯åæ°éå®åçä»¿å½æ°å®ãé¢å¤çå®åï¼æ¯è°å¯åå®åï¼å¯ç¨ __VA_ARGS__ æ è¯ç¬¦è®¿é®ï¼å®ä¼è¢«ä¸è¦è¢«æ¿æ¢çæ è¯ç¬¦ä¸èµ·æä¾çå®åæ¿æ¢ã
#define æä»¤ççæ¬ (4) å®ä¹æå¯åæ°éå®åçä»¿å½æ°å®ï¼ä½æ 常è§å®åãé¢å¤çå®åï¼æ¯è°å¯åå®åï¼åªè½ç¨ __VA_ARGS__ æ è¯ç¬¦è®¿é®ï¼å®ä¼è¢«ä¸è¦è¢«æ¿æ¢çæ è¯ç¬¦ä¸èµ·æä¾çå®åæ¿æ¢ã
|
对äºçæ¬ (3,4)ï¼æ¿æ¢å表 å¯ä»¥å«æè®°å·åºåâ #define F(...) f(0 __VA_OPT__(,) __VA_ARGS__) #define G(X, ...) f(0, X __VA_OPT__(,) __VA_ARGS__) #define SDEF(sname, ...) S sname __VA_OPT__(= { __VA_ARGS__ }) F(a, b, c) // æ¿æ¢ä¸º f(0, a, b, c) F() // æ¿æ¢ä¸º f(0) G(a, b, c) // æ¿æ¢ä¸º f(0, a, b, c) G(a, ) // æ¿æ¢ä¸º f(0, a) G(a) // æ¿æ¢ä¸º f(0, a) SDEF(foo); // æ¿æ¢ä¸º S foo; SDEF(bar, 1, 2); // æ¿æ¢ä¸º S bar = { 1, 2 }; |
(C++20 èµ·) |
注æï¼è¥ä»¿å½æ°å®çå®åä¸å å«ä¸ä¸ºå¹é ç左峿¬å·å¯¹æä¿æ¤çéå·ï¼æå¸¸åºç°äºæ¨¡æ¿å®åå表ä¸ï¼å¦ assert(std::is_same_v<int, int>); æ BOOST_FOREACH(std::pair<int,int> p, m)ï¼ï¼åéå·è¢«è§£éæå®å®ååé符ï¼å¹¶é æç±äºå®åæ°éä¸å¹é æè´çç¼è¯å¤±è´¥ã
ä¿çå®å
å
嫿 ååºå¤´æä»¶çç¿»è¯åå
ä¸å¯ #define æ #undef 声æäºä»»ä½æ ååºå¤´æä»¶ä¸æå£°æçååã
ä½¿ç¨æ ååºä»»ä½é¨åçç¿»è¯åå
ä¸å¯ #define æ #undef è¯æ³ä¸çåäºä¸åå
容çåç§°ï¼
| (C++11 èµ·) |
|
é¤äºå¯å®ä¹ |
(C++20 èµ·) |
å¦åï¼è¡ä¸ºæªå®ä¹ã
# ä¸ ## è¿ç®ç¬¦
ä»¿å½æ°å®ä¸ï¼æ¿æ¢å表 䏿¾å¨æ è¯ç¬¦åç # è¿ç®ç¬¦ï¼ä½¿æ è¯ç¬¦è¿è¡å½¢åæ¿æ¢ï¼å¹¶å°å
¶ç»æä»¥å¼å·å
å´ï¼å®é
ä¸å建ä¸ä¸ªå符串åé¢éãå¦å¤ï¼é¢å¤çå¨ä¸ºå
åµçå符串åé¢éï¼è¥å®åå¨ï¼å¤å´çå¼å·æ·»å åææ 以è¿è¡è½¬ä¹ï¼å¹¶æéè¦ååå符串ä¸çåææ ãç§»é¤ææå导åå°¾é空ç½ç¬¦ï¼å¹¶å°ææ¬ä¸é´ï¼ä½éå
åµå符串åé¢éä¸é´ï¼çä»»ä½ç©ºç½ç¬¦åºå缩åæåä¸ªç©ºæ ¼ãæ¤æä½è¢«ç§°ä¸ºâå符串åâï¼è¥å符串åçç»æä¸æ¯åæ³çå符串åé¢éï¼åè¡ä¸ºæªå®ä¹ã
|
#define showlist(...) puts(#__VA_ARGS__) showlist(); // å±å¼æ puts("") showlist(1, "x", int); // å±å¼æ puts("1, \"x\", int") |
(C++11 èµ·) |
æ¿æ¢å表 ä¸ä»»ä½ä¸¤ä¸ªç¸ç»§æ è¯ç¬¦ä¹é´ç ## è¿ç®ç¬¦ï¼ä½¿äºä¸ªæ è¯ç¬¦ï¼é¦å
æªè¢«å®å±å¼ï¼ä¸è¿è¡å½¢åæ¿æ¢ï¼ç¶åå°ç»æè¿è¡æ¼æ¥ãæ¤æä½è¢«ç§°ä¸ºâæ¼æ¥âæâè®°å·ç²è´´âãåªæä¸åç»æåæ³è®°å·çè®°å·æå¯ä»¥ç²è´´ï¼å¦ç»ææ´é¿æ è¯ç¬¦çæ è¯ç¬¦ãç»ææ°åçæ°åä½ï¼æç»æ += çè¿ç®ç¬¦ + å =ãä¸è½éè¿ç²è´´ / å * æ¥å建注éï¼å 为å¨èèææ¬å®æ¿æ¢åï¼æ³¨é就已被移é¤äºãè¥è¿æ¥çç»æä¸æ¯åæ³è®°å·ï¼åè¡ä¸ºæªå®ä¹ã
注æï¼ä¸äºç¼è¯å¨æä¾äºä¸é¡¹æ©å±ï¼å
许 ## åºç°äºéå·åå __VA_ARGS__ åï¼æ¤æ
åµä¸ ## å¨åå¨å¯åå®åæ¶ä¸åä»»ä½äºï¼ä½å¨ä¸åå¨å¯åå®åæ¶ç§»é¤éå·ï¼è¿ä½¿å¾å¯ä»¥å®ä¹å¦ fprintf (stderr, format, ##__VA_ARGS__) è¿æ ·çå®ã
#undef æä»¤
#undef æä»¤åæ¶å®ä¹ æ è¯ç¬¦ï¼å³åæ¶ #define æä»¤æä½ç æ è¯ç¬¦ å®ä¹ãè¥æ è¯ç¬¦æªå
³èå°å®ï¼å忽ç¥è¯¥æä»¤ã
é¢å®ä¹å®
ä¸åå®åå·²é¢å®ä¹äºæ¯ä¸ªç¿»è¯åå ä¸ã
| __cplusplus |
代表æç¨ç C++ æ åçæ¬ï¼å±å¼æå¼ 199711L(C++11 å)ã201103L(C++11)ã201402L(C++14) æ 201703L(C++17) (å®å¸¸é) |
| __STDC_HOSTED__ (C++11) |
è¥å®ç°æå®¿ä¸»ï¼è¿è¡å¨ OS ä¸ï¼åå±å¼ææ´æ°å¸¸é 1ï¼è¥å®ç°èªç«ï¼ä¸é OS è¿è¡ï¼åå±å¼æ â0â (å®å¸¸é) |
| __FILE__ |
å±å¼æå½åæä»¶åï¼ä½ä¸ºå符串åé¢éï¼å¯ç¨ #line æä»¤æ´æ¹ (å®å¸¸é) |
| __LINE__ |
å±å¼ææºæä»¶è¡å·ï¼æ´æ°å¸¸éï¼å¯ç¨ #line æä»¤æ´æ¹ (å®å¸¸é) |
| __DATE__ |
å±å¼æç¿»è¯æ¥æï¼å½¢å¼ä¸º "Mmm dd yyyy" çå符串ãè¥æä¸æ¥ææ°å°äº 10 å "dd" çé¦åç¬¦ä¸ºç©ºæ ¼ãæä»½åå¦å以 std::asctime() çæ (å®å¸¸é) |
| __TIME__ |
å±å¼æç¿»è¯æ¶é´ï¼å½¢å¼ä¸º "hh:mm:ss" çå符串åé¢é (å®å¸¸é) |
| __STDCPP_DEFAULT_NEW_ALIGNMENT__ (C++17) |
å±å¼æ std::size_t åé¢éï¼å
¶å¼ä¸ºå¯¹ä¸å
·å¯¹é½ç operator new çè°ç¨æä¿è¯ç对é½ï¼æ´å¤§ç对é½å°ä¼ éç»å
·å¯¹é½éè½½ï¼å¦ operator new(std::size_t, std::align_val_t)ï¼ (å®å¸¸é) |
å®ç°å¯è½é¢å®ä¹ä¸åå ¶ä»çå®åã
| __STDC__ |
è¥åå¨å为å®ç°å®ä¹å¼ï¼å
¸åå°ç¨äºæç¤º C éµä»æ§ (å®å¸¸é) |
| __STDC_VERSION__ (C++11) |
è¥åå¨å为å®ç°å®ä¹å¼ (å®å¸¸é) |
| __STDC_ISO_10646__ (C++11) |
è¥ wchar_t ä½¿ç¨ Unicode ï¼åå±å¼æ yyyymmL å½¢å¼çæ´æ°å¸¸éï¼æ¥ææç¤ºææ¯æç Unicode çæè¿çæ¬ (å®å¸¸é) |
| __STDC_MB_MIGHT_NEQ_WC__ (C++11) |
è¥å¯¹äºåºæ¬å符éæå 'x' == L'x' å¯è½ä¸ºåï¼åå±å¼æ 1ï¼å¦å¨åºäº EBCDIC å¹¶ä¸ä¸º wchar_t ä½¿ç¨ Unicode çç³»ç»ä¸ã (å®å¸¸é) |
| __STDCPP_STRICT_POINTER_SAFETY__ (C++11) |
è¥å®ç°æ¯æä¸¥æ ¼ std::pointer_safety åå±å¼æ 1 (å®å¸¸é) |
| __STDCPP_THREADS__ (C++11) |
è¥ç¨åºè½æ¥æå¤äºä¸ä¸ªæ§è¡çº¿ç¨åå±å¼æ 1 (å®å¸¸é) |
è¿äºå®çå¼ï¼é¤äº __FILE__ å __LINE__ï¼ï¼å¨ç¿»è¯åå
é´ä¿æä¸ºå¸¸éãè¯å¾éå®ä¹æåæ¶å®ä¹è¿äºå®å¯¼è´æªå®ä¹è¡ä¸ºã
注æï¼å¨æ¯ä¸ªå½æ°ä½çä½ç¨åå
é¨ï¼é½æä¸ä¸ªå为 __func__ çç¹æ®ç彿°å±åé¢å®ä¹åé(C++11 èµ·)ï¼å®ä¹ä¸ºä¸ä¸ªææå
·æå®ç°å®ä¹æ ¼å¼ç彿°åçéæå符æ°ç»ãå®ä¸æ¯é¢å¤çå¨å®ï¼ä½å®ä¸ __FILE__ å __LINE__ ä¸èµ·ä½¿ç¨ï¼ä¾å¦ assertã
è¯è¨åè½ç¹æ§æµè¯å®ä¸åå®é¢å®ä¹äºæ¯ä¸ªç¿»è¯åå ã
|
(C++20 èµ·) |
示ä¾
#include <iostream>  // å¶é 彿°å·¥å并使ç¨å® #define FUNCTION(name, a) int fun_##name() { return a;}  FUNCTION(abcd, 12) FUNCTION(fff, 2) FUNCTION(qqq, 23)  #undef FUNCTION #define FUNCTION 34 #define OUTPUT(a) std::cout << "output: " #a << '\n'  int main() { std::cout << "abcd: " << fun_abcd() << '\n'; std::cout << "fff: " << fun_fff() << '\n'; std::cout << "qqq: " << fun_qqq() << '\n'; std::cout << FUNCTION << '\n'; OUTPUT(million); // 注æç¼ºå°å¼å· }
è¾åºï¼
abcd: 12 fff: 2 qqq: 23 34 output: million