æºæä»¶å å«
å°å ¶ä»æºæä»¶å å«å°å½åæºæä»¶ä¸ç´§éæä»¤ä¹åçä¸è¡ã
ç®å½ |
[ç¼è¾] è¯æ³
#include < hå符åºå > æ¢è¡
|
(1) | ||||||||
#include " qå符åºå " æ¢è¡
|
(2) | ||||||||
#include è®°å·åºå æ¢è¡
|
(3) | ||||||||
__has_include ( " qå符åºå " ) __has_include ( < hå符åºå > )
|
(4) | (C++17 èµ·) | |||||||
__has_include ( å符串åé¢é ) __has_include ( < hè®°å·åºå > )
|
(5) | (C++17 èµ·) | |||||||
æ¢è¡ | - | æ¢è¡ç¬¦ |
hå符åºå | - | ä¸ä¸ªæå¤ä¸ª hå符ï¼å¹¶ä¸å
¶ä¸ä»¥ä¸å
容çåºç°åæ¡ä»¶æ§æ¯æï¼
|
hå符 | - | æºå符é (C++23 å)ç¿»è¯å符é (C++23 èµ·) é¤äºæ¢è¡ç¬¦å > 以å¤ç任使å
|
qå符åºå | - | ä¸ä¸ªæå¤ä¸ª qå符ï¼å¹¶ä¸å
¶ä¸ä»¥ä¸å
容çåºç°åæ¡ä»¶æ§æ¯æï¼
|
qå符 | - | æºå符é (C++23 å)ç¿»è¯å符é (C++23 èµ·) é¤äºæ¢è¡ç¬¦å " 以å¤ç任使å
|
è®°å·åºå | - | ä¸ä¸ªæå¤ä¸ªé¢å¤çè®°å· |
å符串åé¢é | - | ä¸ä¸ªå符串åé¢é |
hè®°å·åºå | - | ä¸ä¸ªæå¤ä¸ªé¤äº > 以å¤çé¢å¤çè®°å·
|
[ç¼è¾] 说æ
include
åé¢çé¢å¤çè®°å·ä¼æå¨æ£å¸¸ææ¬ä¸è¿è¡å¤çï¼å³æ¯ä¸ªç®åå®ä¹ä¸ºå®åçæ è¯ç¬¦é½ä¼è¢«æ¿æ¢ä¸ºå®çé¢å¤çè®°å·æ¿æ¢å表ï¼å¦æå¨æææ¿æ¢é½å®æåçæçæä»¤ä¸å¹é
åé¢ä¸¤ç§è¯æ³ï¼é£ä¹è¡ä¸ºæªå®ä¹ãå°å¨ä¸å¯¹é¢å¤çè®°å· < å > ä¹é´æä¸å¯¹ " å符ä¹åçé¢å¤çè®°å·åºåå并为å个头åé¢å¤çè®°å·çæ¹æ³ç±å®ç°å®ä¹ã#include
æä»¤çè¯æ³è¦æ±ï¼é£ä¹ç¨åºéè¯æã妿æç´¢æåï¼__has_include
è¡¨è¾¾å¼æ±å¼ä¸º 1ï¼å¦åï¼æç´¢å¤±è´¥æ¶ï¼æ±å¼ä¸º 0ã
å¦æç± å¤´åï¼å³
|
(C++20 èµ·) |
__has_include
å¯ä»¥å¨
#if å
#elif ä¸ç表达å¼å±å¼ãå®è¢«
#ifdefï¼
#ifndefï¼
#elifdefï¼
#elifndef (C++23 èµ·) å defined è§ä¸ºå·²å®ä¹çå®ï¼ä½ä¸è½å¨å
¶ä»ä»»ä½å°æ¹ä½¿ç¨ã
[ç¼è¾] 注解
è¯æ³ (1) çæå¾æ¯æç´¢ç±å®ç°æææ§çæä»¶ãå ¸åå®ç°ä» æç´¢æ åå å«ç®å½ãè¿äºæ åå å«ç®å½ä¸éå«å°å 嫿 å C++ åºåæ å C åºãç¨æ·é常è½éè¿ç¼è¯å¨éé¡¹æ¥æ§å¶æ åå å«ç®å½ã
è¯æ³ (2) çæå¾æ¯æç´¢ä¸è¢«å®ç°æææ§çæä»¶ãå ¸åå®ç°é¦å äºå½åæä»¶æå¨çç®å½æç´¢ï¼ç¶åéå使ç¨è¯æ³ (1)ã
å
å«ä¸ä¸ªæä»¶æ¶ï¼å®å°ç»è¿ç¿»è¯é¶æ®µ 1-4 çå¤çï¼è¿å¯è½éå½å°å
å«åµå¥ #include
æä»¤çå±å¼ï¼ç´å°ä¸ä¸ªç±å®ç°å®ä¹çåµå¥éå¶ã为é¿å
ï¼å¯è½ä¼ éæ§å°ï¼éå¤å
å«ç¸åæä»¶ï¼åç±æä»¶å
å«èªèº«é æçæ ééå½ï¼é常使ç¨å¤´æä»¶é²æ¤ï¼æ´ä¸ªå¤´æä»¶è¢«å
è£
å¨ä¸åç»æä¸
#ifndef FOO_H_INCLUDED /* ä»»ä½å¯ä¸å°æ å°å°æä»¶çåç§° */ #define FOO_H_INCLUDED // æä»¶å 容卿¤ #endif
许å¤ç¼è¯å¨ä¹ä¼å®ç°æç±»ä¼¼ææçéæ å pragma #pragma onceï¼å¨å·²ç»å å«ç¸åæä»¶ï¼æä»¶ç身份以æä½ç³»ç»æå®çæ¹å¼ç¡®å®ï¼çæ¶åç¦æ¢å¤ç该æä»¶ã
妿 hå符åºå æ qå符åºå ä¸å å«äºç±»ä¼¼è½¬ä¹åºåçåºåï¼é£ä¹æ ¹æ®å®ç°å¯è½ä¼å¯¼è´é误ï¼è¢«å¤ç为转ä¹åºå对åºçåç¬¦ï¼æè å ·æå®å ¨ä¸åçå«ä¹ã
ç»ææ¯ 1 ç __has_include
åªè¡¨æå卿æå®åç§°çå¤´ææºæä»¶ãå®å¹¶ä¸æå³çå
å«è¯¥å¤´ææºæä»¶æ¶ä¸ä¼å¯¼è´éè¯¯ï¼æå®ä¼å
å«ä»»ä½ææä¹çå
容ãä¾å¦å¨åæ¶æ¯æ C++14 å C++17 模å¼ï¼å¹¶å¨å
¶ C++14 模å¼ä½ä¸ºä¸é¡¹éµä»æ åçæ©å±èæä¾ __has_includeï¼ç C++ å®ç°ä¸ï¼__has_include(<optional>) å¨ C++14 模å¼ä¸å¯ä»¥æ¯ 1ï¼ä½å®é
ä¸ #include <optional> å¯è½å¯¼è´é误ã
[ç¼è¾] 示ä¾
#if __has_include(<optional>) # include <optional> # define has_optional 1 template<class T> using optional_t = std::optional<T>; #elif __has_include(<experimental/optional>) # include <experimental/optional> # define has_optional -1 template<class T> using optional_t = std::experimental::optional<T>; #else # define has_optional 0 # include <utility> template<class V> class optional_t { V v_{}; bool has_{false}; public: optional_t() = default; optional_t(V&& v) : v_(v), has_{true} {} V value_or(V&& alt) const& { return has_ ? v_ : alt; } /*...*/ }; #endif #include <iostream> int main() { if (has_optional > 0) std::cout << "<optional> åå¨\n"; else if (has_optional < 0) std::cout << "<experimental/optional> åå¨\n"; else std::cout << "<optional> ä¸åå¨\n"; optional_t<int> op; std::cout << "op = " << op.value_or(-1) << '\n'; op = 42; std::cout << "op = " << op.value_or(-1) << '\n'; }
è¾åºï¼
<optional> åå¨ op = -1 op = 42
[ç¼è¾] ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
---|---|---|---|
CWG 787 | C++98 | 妿 hå符åºå æ qå符åºå ä¸å å«äºç±»ä¼¼è½¬ä¹åºåçåºåï¼é£ä¹è¡ä¸ºæªå®ä¹ | æ¹ä¸ºåæ¡ä»¶æ§æ¯æ |
[ç¼è¾] åé
C++ æ ååºå¤´æä»¶å表 | |
æºæä»¶å
å« ç C ææ¡£
|