㈠ 「Keil C51」下如何讓編譯器優先使用片內「RAM」
C51內存拿歲者結構深度剖析x0dx0a在編寫應用程序時,定義一個變數,一個數組,或是說一個固定表格,到底存儲在什麼地方;當定義變數大小超過MCU的內存范圍時怎麼辦;如何控制變數定義不超過存儲范圍;以及如何定義變數才能使得變數訪問速度最快,寫出的程序運行效率最高。以下將一一解答。x0dx0ax0dx0a1 六類關鍵字(六類存儲類型)x0dx0adata idata xdata pdata code bdatax0dx0ax0dx0a code: code memory (程序存儲器也即只讀存儲器)用來保存常量或是程序。code memory 採用16位地址線編碼,可以是在片內,或是片外,大小被限制在64KBx0dx0a 作用:定義常量,如八段數碼表或是編程使用的常,在定義時加上code 或明確指明定義的常量保存到code memory(只讀)x0dx0a 使用方法:x0dx0a char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};x0dx0a 此關鍵字的使用方法等同於constx0dx0ax0dx0adata data memory (數據存儲區)只能用於聲明變數,不能用來聲明函數,該區域位於片內,採用8位地址線編碼,具有最快的存儲速度,但是數量被限制在128byte或更少。x0dx0a 使用方法:x0dx0a unsigned char data fast_variable=0;x0dx0ax0dx0a idata idata memory(數據存儲區)只能用於聲明變數,不能用來聲明函數. 該區域位於片內,採用8位地址線編碼,內存大小被限制在256byte或更少。該區域消薯的低地址區與data memory地址一致;高地址區域是52系列在51系列基礎上擴展的並與特殊功能寄存器具有相同地址編碼的區域。即:data memory是idata memory的一個子集。x0dx0a x0dx0a xdata xdata memory 只能用於聲明變數,不能用來聲明函數,該區域位於MCUx0dx0a 外部,採用16位地址線進行編碼,存儲大小被限制在64KB以內。x0dx0a 使用方法:x0dx0a unsigned char xdata count=0;x0dx0ax0dx0apdata pdata memory 只能用於聲明變數,不能用雀衫來聲明函數,該區域位於MCU外部,採用8位地址線進行編碼。存儲大小限制在256byte. 是xdata memory的低256byte。為其子集。x0dx0a 使用方法x0dx0a unsigned char pdata count=0;x0dx0ax0dx0a bdata bdata memory 只能用於聲明變數,不能用來聲明函數。該區域位於8051內部位數據地址。定義的量保存在內部位地址空間,可用位指令直接讀寫。x0dx0a 使用方法:x0dx0a unsigned char bdata varab=0x0dx0ax0dx0a 註:有些資料講,定義字元型變數時,在預設unsigned 時,字元型變數,默認為無符號,與標准C不同,但我在Keil uVision3中測試的時候發現並非如此。在預設的情況下默認為有符號。或許在以前的編譯器是默認為無符號。所以看到有的資料上面這樣講的時候,要注意一下,不同的編譯器或許不同。所以我們在寫程序的時候,還是乖乖的把unsigned signed 加上,咱也別偷這個懶。x0dx0a 2函數的參數和局部變數的存儲模式x0dx0a C51 編譯器允許採用三種存儲器模式:SMALL,COMPACT 和LARGE。一個函數的存儲器模式確定了函數的參數的局部變數在內存中的地址空間。處於SMALL模式下的函數參數和局部變數位於8051單片機內部RAM中,處於COMPACT和LARGE模式下的函數參數和局部變數則使用單片機外部RAM。在定義一個函數時可以明確指定該函數的存儲器模式。方法是在形參表列的後面加上一存儲模式。x0dx0a x0dx0a 示例如下:x0dx0a #pragma large //此預編譯必須放在所有頭文前面x0dx0a int func0(char x,y) small;x0dx0a char func1(int x) large;x0dx0a int func2(char x);x0dx0a 註:x0dx0a 上面例子在第一行用了一個預編譯命令#pragma 它的意思是告訴c51編譯器在對程序進行編譯時,按該預編譯命令後面給出的編譯控制指令LARGE進行編譯,即本常式序編譯時的默認存儲模式為LARGE.隨後定義了三個函數,第一個定義為SMALL存儲模式,第二個函數定義為LARGE第三個函數未指定,在用C51進行編譯時,只有最後一個函數按LARGE存儲器模式處理,其它則分別按它們各自指定的存儲器模式處理。x0dx0a 本例說明,C51編譯器允許採用所謂的存儲器混合模式,即允許在一個程序中將一些函數使用一種存儲模式,而其它一些則按另一種存儲器模式,採用存儲器混合模式編程,可以充分利用8051系列單片機中有限的存儲器空間,同時還可以加快程序的執行速度。x0dx0ax0dx0a3絕對地址訪問 absacc.h(相當重要)x0dx0ax0dx0a#define CBYTE ((unsigned char volatile code *) 0)x0dx0a#define DBYTE ((unsigned char volatile data *) 0)x0dx0a#define PBYTE ((unsigned char volatile pdata *) 0)x0dx0a#define XBYTE ((unsigned char volatile xdata *) 0)x0dx0a 功能:CBYTE 定址 CODE區x0dx0a DBYTE 定址 DATA區x0dx0a PBYTE 定址 XDATA(低256)區x0dx0a XBYTE 定址 XDATA區x0dx0a 例: 如下指令在對外部存儲器區域訪問地址0x1000x0dx0a xvar=XBYTE[0x1000];x0dx0a XBYTE[0x1000]=20;x0dx0ax0dx0a#define CWORD ((unsigned int volatile code *) 0)x0dx0a#define DWORD ((unsigned int volatile data *) 0)x0dx0a#define PWORD ((unsigned int volatile pdata *) 0)x0dx0a#define XWORD ((unsigned int volatile xdata *) 0)x0dx0ax0dx0a 功能:與前面的一個宏相似,只是它們指定的數據類型為unsigned int .。x0dx0a 通過靈活運用不同的數據類型,所有的8051地址空間都是可以進行訪問。x0dx0a 如x0dx0aDWORD[0x0004]=0x12F8;x0dx0a即內部數據存儲器中(0x08)=0x12; (0x09)=0xF8x0dx0ax0dx0a註:用以上八個函數,可以完成對單片機內部任意ROM和RAM進行訪問,非常方便。還有一種方法,那就是用指鍾,後面會對C51的指針有詳細的介紹。x0dx0ax0dx0a4寄存器變數(register)x0dx0a 為了提高程序的執行效率,C語言允許將一些頻率最高的那些變數,定義為能夠直接使用硬體寄存器的所謂的寄存器變數。定義一個變數時,在變數類型名前冠以「register」 即將該變數定義成為了寄存器變數。寄存器變數可以認為是一自動變數的一種。有效作用范圍也自動變數相同。由於計算機寄存器中寄存器是有限的。不能將所有變數都定義成為寄存器變數,通常在程序中定義寄存器變數時,只是給編譯器一個建議,該變數是否真正成為寄存器變數,要由編譯器根據實際情況來確定。另一方面,C51編譯器能夠識別程序中使用頻率最高的變數,在可能的情況下,即使程序中並未將該變數定義為寄存器變數,編譯器也會自動將其作為寄存器變數處理。被定義的變數是否真正能成為寄存器變數,最終是由編譯器決定的。x0dx0ax0dx0a5內存訪問雜談x0dx0a 1指鍾x0dx0a指鍾本身是一個變數,其中存放的內容是變數的地址,也即特定的數據。8051的地址是16位的,所以指針變數本身佔用兩個存儲單元。指針的說明與變數的說明類似,僅在指針名前加上「*」即可。x0dx0a 如 int *int_point; 聲明一個整型指針x0dx0a char *char_point; 聲明一個字元型指針x0dx0a 利用指針可以間接存取變數。實現這一點要用到兩個特殊運算符x0dx0a & 取變數地址x0dx0a * 取指針指向單元的數據x0dx0ax0dx0a示例一:x0dx0aint a,b;x0dx0a int *int_point; //定義一個指向整型變數的指針x0dx0a a=15;x0dx0a int_point=&a; //int_point指向 ax0dx0a *int_point=5; //給int_point指向的變數a 賦值5 等同於a=5; x0dx0a示例二:x0dx0a char i,table[6],*char_point;x0dx0a char_point=table;x0dx0a for(i=0;i<6;i++)x0dx0a {x0dx0a char_point=i;x0dx0a char_point++;x0dx0a}x0dx0a註:x0dx0a 指針可以進行運算,它可以與整數進行加減運算(移動指針)。但要注意,移動指針後,其地址的增減量是隨指針類型而異的,如,浮點指針進行自增後,其內部將在原有的基礎上加4,而字元指針當進生自增的時候,其內容將加1。原因是浮點數,佔4個內存單元,而字元佔一個位元組。x0dx0ax0dx0a宏晶科技最新一代STC12C5A360S2系列,每一個單片機出廠時都有全球唯一身份證號碼(ID號),用戶可以在單片機上電後讀取內部RAM單元F1H~F7H的數值,來獲取此單片機的唯一身份證號碼。使用MOV @Ri 指令來讀取。下面介紹C51 獲取方法:x0dx0a char id[7]={0};x0dx0a char i;x0dx0a char idata *point;x0dx0a for(i=0;i<7;i++)x0dx0a {x0dx0a id[i]=*point;x0dx0a point++;x0dx0a}x0dx0a x0dx0a(此處只是對指針做一個小的介紹,達到訪問內部任何空間的方式,後述有對指針使用的詳細介紹)x0dx0a2對SFR,RAM ,ROM的直接存取x0dx0aC51提供了一組可以直接對其操作的擴展函數x0dx0a若源程序中,用#include包含頭文件,io51.h 後,就可以在擴展函數中使用特殊功能寄存器的地址名,以增強程序的可讀性:x0dx0ax0dx0a 注 此方法對SFR,RAM,ROM的直接存取不建議使用.因為,淡io51.h這個頭文件在KEIL中無法打開,可用指針,或是採用absacc.h頭文件,
㈡ 瀛︾敓蹇呯湅c璇璦蹇呯湅甯歌佺﹀彿鍒嗙被闆嗗悎璐
C璇璦甯歌佺﹀彿鍒嗙被鐪嬪畬浣犲氨鎳備簡......
1銆佸叧閿瀛
鍏抽敭瀛楋紝鍙堢О涓轟繚鐣欏瓧錛屼粬浠鏄疌璇璦涓棰勫厛瑙勫畾鐨勫叿鏈夊滻瀹氬惈涔夌殑涓浜涘崟璇嶏紝渚嬪侰璇璦鐨勭涓涓紼嬪簭涓鐨剗nt鍜宺eturn絳夛紝鐢ㄦ埛鍙鑳芥寜棰勫厛瑙勫畾鐨勫惈涔夋潵浣跨敤浠栦滑涓嶈兘鎿呰嚜鏀瑰彉鍏跺惈涔夈
2銆佹爣璇嗙
鏍囪瘑絎﹀垎涓虹郴緇熼勫畾涔夋爣璇嗙﹀拰鐢ㄦ埛鑷瀹氫箟鏍囪瘑絎︿袱綾匯
欏懼悕鎬濅箟錛岀郴緇熼勫畾涔夋爣璇嗙﹀氨鏄鐢辯郴緇熼勫厛瀹氫箟濂界殑錛屼緥濡備富鍑芥暟main鍜岃緭鍑哄嚱鏁皃rintf絳夌瓑銆備笌鍏抽敭瀛椾笉鍚岀殑鏄錛岀郴緇熼勫畾涔夋爣璇嗙︽槸鍙浠ョ敱鐢ㄦ埛閲嶆柊瀹氫箟鐨勶紝浣嗘槸榪欐牱浼氫簬鍘熸潵鐨勫畾涔変駭鐢熷啿紿侊紝鍘熸潵鐨勫惈涔変細琚鏇挎崲錛屾墍浠ヤ笉寤鴻榪欐牱鐢!
鐢ㄦ埛鑷瀹氫箟鏍囪瘑絎︽槸鐢辯敤鎴鋒牴鎹闇瑕佽嚜琛屽畾涔夌殑鏍囪瘑絎︼紝閫氬父鐢ㄥ仛鍙橀噺鍚嶏紝鍑芥暟鍚嶇瓑錛屾爣璇嗙︾殑鍛藉悕鏈変竴瀹氱殑瑙勫垯
3銆佽繍綆楃
棣栧厛鍏堣存槑涓涓嬶紝榪愮畻絎︿竴鍏辨湁44涓錛岃繖閲屾病鏈変竴涓鍒椾婦銆傜劧鍚庯紝鍥犱負榪愮畻絎︾殑鐢ㄦ硶騫挎硾錛岀嶇被綣佹潅錛屾墍浠ヨ繖閲屽彧鏄鍒椾婦鍒嗙被錛岀湡姝g殑鐢ㄩ旀兂瑕佽叉竻妤氬彲鑳借佸緢涔呮墍浠ワ紝鍏堜簡瑙f湁鍝浜涘嵆鍙錛岃頒笉浣忎篃娌″叧緋葷殑錛屼笉鐢ㄧ揣寮犵殑鍝!
1銆佺畻鏁拌繍綆楃:+鍔犮-鍑忋*涔樸/闄ゃ%鍙栦綑銆
2銆佸叧緋昏繍綆楃:>澶т簬銆 >=澶у共絳夊共銆==絳変簬銆<灝忓共銆<=灝忎簬絳変簬銆 !=涓嶇瓑浜
3銆侀昏緫榪愮畻絎:!閫昏緫闈炪&&閫昏緫涓庛亅閫昏緫鎴栥4銆佽祴鍊艱繍綆楃:= 灝嗙瓑鍙峰彸杈圭殑鏁版嵁璧嬪肩粰絳夊彿宸﹁竟銆5銆佸炰竴鍜屽噺涓榪愮畻絎: ++澧炰竴銆 --鍑忎竴銆
4銆佸垎闅旂
鍐欐枃絝犱負浜嗕笉浜х敓姝т箟錛屾垜浠浼氬湪閫傚綋鐨勪綅緗澧炲姞鏍囩偣絎﹀彿錛岀敤鏉ュ尯鍒嗐傝屽啓C璇璦紼嬪簭錛屽氨浼氱敤鍒嗛殧絎︽潵鍖哄垎銆
渚嬪:灝忔槑鏍¢暱鎵句綘銆傚拰灝忔槑錛屾牎闀挎壘浣犮傚拰灝忔槑鏍¢暱鎵句綘銆
int a=1;鍓嶄竴鍙ュ氨鏄瀵瑰拰inta=1;鐨勶紝int a=1;灝辨槸鍛藉悕涓涓鏁村艦鐨勫彉閲廰絳変簬1銆傝宨nta=1;閿欒鐨勶紝鍥犱負inta濡傛灉鏄涓涓鍙橀噺鍚嶇殑璇濓紝閭e畠灝辨病鏈夋暟鎹綾誨瀷浜唅nt a,b,C; 閫楀彿涔熸槸鍒嗛殧絎︾殑涓縐嶏紝琛ㄧず鍛藉悕涓変釜鍙橀噺錛屽垎鍒鏄痑錛宐錛孋
5銆佸叾浠栫﹀彿
鎷鍙穂] - 鎷鍙風殑鎵撳紑鍜屽叧闂鐢ㄤ簬鏁扮粍鍏冪礌寮曠敤錛岃〃紺哄崟緇村拰澶氱淮涓嬫爣銆
鎷鍙() - 榪欎簺鐗規畩絎﹀彿鐢ㄤ簬鍑芥暟璋冪敤鍜屽嚱鏁板弬鏁板ぇ鎷鍙蜂粏 - 鑺辨嫭鍙風殑鎵撳紑鍜屽叧闂琛ㄧず鍖呭惈澶氫釜鍙鎵ц岃鍙ョ殑浠g爜鍧楃殑寮濮嬪拰緇撴潫銆
鍒嗗彿()- 瀹冭縐頒負璇鍙ョ粓姝㈢︼紝鎸囩ず涓涓閫昏緫瀹炰綋鐨勭粨鏉熴傝繖灝辨槸姣忎釜鍗曠嫭鐨勮鍙ュ繀欏諱互鍒嗗彿緇撳熬鐨勫師鍥犻勫勭悊鍣ㄧ﹀彿(#) - 緙栬瘧鍣ㄤ嬌鐢ㄧО涓哄畯澶勭悊鍣ㄧ殑棰勫勭悊鍣ㄥ湪瀹為檯緙栬瘧寮濮嬩箣鍓嶈漿鎹㈡偍鐨勭▼搴忋傚畾鐣岀"/*"鍜"*/鈥 - 紼嬪簭娉ㄩ噴鎵鐢ㄧ殑絎﹀彿銆
6銆佺紪璇戙侀摼鎺
緙栬瘧鍒嗕負鍥涗釜闃舵:
錛1)棰勭紪璇:涔熺О棰勫勭悊錛孋紼嬪簭涓鐨勯勫勭悊鍛戒護閮藉湪榪欎釜闃舵靛畬鎴愶紝棰勭紪璇戝畬鎴愮殑鏄瀵規簮紼嬪簭鐨勨滄浛鎹⑩濆伐浣溿"#灝辨槸棰勫勭悊絎﹀彿銆
錛2)緙栬瘧闃舵:瀵歸勭紪璇戠殑C紼嬪簭榪涜岃瘝娉曞拰璇娉曞垎鏋愬皢閿欒鍛堢幇鍑烘潵錛屽勭悊瀹屾垚鍚庯紝緙栬瘧鍣ㄤ細灝咰紼嬪簭杞涓烘眹緙栬璦鎴栧叾浠栦腑闂翠唬鐮併
錛3)浼樺寲闃舵:瀵圭▼搴忎唬鐮佽繘琛屼紭鍖栵紝璋冩暣緙╄繘絳夌瓑銆4)奼囩紪闃舵:鎶婁腑闂翠唬鐮佺炕璇戞垚鏈哄櫒浠g爜錛屼篃灝辨槸浜岃繘鍒朵唬鐮侊紝淇濆瓨鍦ㄧ洰鏍囨枃浠朵腑
閾炬帴
緇忚繃緙栬瘧鍚庣殑鐩鏍囨枃浠剁殑鏈哄櫒鐮佷箣闂存槸鐩鎬簰鐙絝嬬殑錛屽洜姝わ紝闇瑕侀摼鎺ュ櫒灝嗗畠浠閾炬帴緇勫悎鍦ㄤ竴璧鳳紝騫惰В鏋愬畠浠涔嬮棿鐨勪氦鍙夊紩鐢ㄣ
㈢ boost錛歵r1涓巗td錛歵r1鍐茬獊浜嗘庝箞鍔
鏈榪戠敤boost::math搴擄紝鍙戠幇浼氬拰鎴戜互鍓嶇殑紼嬪簭鍐茬獊銆傛瘮濡傛垜鐨勭▼搴忓傛灉鐢ㄥ埌
#include<tr1/unordered_map> 絳夌瓑std::tr1鍚嶅瓧鍩熶笅鐨勪笢瑗褲傘傘
google浜嗕笅錛屽師鍥犳槸boost::tr1璁捐″垵琛鋒槸涓轟簡鍦ㄤ綘鐨勭郴緇熸病鏈塻td::tr1鏍囧噯搴撳疄鐜扮殑鎯呭喌涓嬭╀綘浠嶇劧鍙浠ュ湪紼嬪簭涓浣跨敤std::tr1::unordered_map, std::tr1::tuple絳変笢涓滐紝褰撶劧浜嗚繖鏄涓涓獁ork around,涔熷氨鏄浣犲叾瀹炶繕鏄鐢ㄧ殑boost::tuple絳夌瓑
鍙鏄浣犵殑浠g爜鍐欑殑鏃跺欏彲浠ュ啓std::tr1::tuple銆
姣斿俠oost鐨刴ath搴撶殑涓涓鍒嗗竷鍑芥暟鐨勫疄鐜
/usr/include/boost/math/special_functions/detail/igamma_inverse.hpp
鍦ㄨユ枃浠剁13琛
#include <boost/tr1/tuple.hpp>
鐒跺悗涓嬮潰瀹冨氨鐢ㄥ埌浜唗uple浣跨敤濡備笅
std::tr1::tuple<T, T, T> operator() (const T& x) const //鍏跺疄鍛㈣繕鏄鐢ㄧ殑boost::涓嬮潰鐨則uple鐪嬩笅/usr/include/boost/tr1/tuple.hpp
namespace std{ namespace tr1{
using ::boost::fusion::tuple;
// [6.1.3.2] Tuple creation functions
using ::boost::fusion::ignore;
using ::boost::fusion::make_tuple;
using ::boost::fusion::tie;
using ::boost::fusion::get;
// [6.1.3.3] Tuple helper classes
using ::boost::fusion::tuple_size;
using ::boost::fusion::tuple_element;
}}
榪欏氨鏄痺ork around鐨勬柟娉曘
鐜板湪闂棰樻潵浜嗭紝鎴戠殑GCC宸茬粡鏈塻td::tr1鐨勫疄鐜頒簡錛屾瘮濡<tr1/unordered_map> ,閭d箞鐫灝變細甯︽潵鍛藉悕鍐茬獊浜嗭紝姣斿傚悓鏃跺張涓や釜tuple瀹氫箟浜嗐傘傘傘俠oost::fusion::tuple鍜屽師鐢熺殑std::tr1::tuple銆
瑙乥oost::tr1鐨勬枃妗
瀹炵幇
濡傛灉 Boost.TR1 琚閰嶇疆 涓轟嬌鐢ㄤ綘鐨勬爣鍑嗗簱涓鐨勫師鐢 TR1 瀹炵幇錛屽垯瀹冧笉闇瑕佸仛澶氬皯浜嬫儏錛氬畠鍙鏄鍖呭惈閫傚綋鐨勫ご鏂囦歡灝辮屼簡銆
濡傛灉 Boost.TR1 浣跨敤浜嗘煇涓緇勪歡鐨 Boost 瀹炵幇錛屽垯瀹冮渶瑕佸寘鍚閫傚綋鐨 Boost 澶存枃浠跺苟浣跨敤澹版槑灝嗘墍闇鐨勫悕瀛楀煎叆鍒 namespace std::tr1 涓銆傛敞鎰忥紝鍙鏈変綔涓烘爣鍑嗛儴鍒嗙殑澹版槑浼氳瀵煎叆錛氭湰瀹炵幇鏈夋剰闈炲父涓ユ牸鍦版病鏈夊皢鎵鏈 Boost-鐗規湁鐨勬墿灞曞紩鍏ュ埌 namespace std::tr1錛岃繖鏄涓轟簡鑳藉熸崟鑾風敤鎴蜂唬鐮佷腑鐨勪換浣曞彲縐繪嶆ч敊璇銆傚傛灉浣犵湡鐨勯渶瑕佷嬌鐢 Boost-鐗規湁鐨勬墿灞曪紝鍒欎綘搴斿綋鐩存帴鍖呭惈 Boost 澶存枃浠訛紝鍒欐敼鐢 namespace boost:: 涓鐨勫0鏄庛傛敞鎰忥紝鏈瀹炵幇鐨勯庢牸騫朵笉鏄瀹屽叏絎﹀悎鏍囧噯鐨勶紝瀹冧笉鑳藉皢鐢ㄦ埛鑷瀹氫箟鐨 TR1 緇勪歡鐨勬ā鏉跨壒鍖栧炲姞鍒 namespace std::tr1 涓銆傝繕鏈変竴鍒頒袱涓 Boost 搴撳皻鏈瀹屽叏絎﹀悎鏍囧噯錛屼換浣曚笌鏍囧噯涓嶇︾殑鍦版柟閮藉凡鍦 "TR1 鐨勫垎綾"涓鑺 涓璇存槑銆備笉榪囧垢濂斤紝榪欎簺涓嶇﹀悎鏍囧噯鐨勮屼負鍦ㄥ疄闄呬腑鏋佸皯浼氱敤鍒般
濡傛灉浣犱嬌鐢ㄦ爣鍑嗙殑澶存枃浠跺寘鍚(鍦 boost/tr1/tr1 涓)錛屽垯榪欎簺澶存枃浠跺悕鏈夋椂鍙鑳戒笌鐜版湁鐨勬爣鍑嗗簱澶存枃浠跺啿紿(渚嬪 shared_ptr 宸插炲姞鍒扮幇鏈夌殑鏍囧噯搴撳ご鏂囦歡 <memory> 涓鑰屼笉鏄瀹冭嚜宸辯殑澶存枃浠)銆傝繖浜涘ご鏂囦歡鍙浠ョ敤浠ヤ笅涓ょ嶆柟娉曚箣涓鍓嶈漿鍒扮幇鏈夌殑鏍囧噯搴撳ご鏂囦歡錛氬逛簬 gcc錛屼嬌鐢 #include_next, 鑰屽逛簬鍏跺畠緙栬瘧鍣ㄥ垯浣跨敤瀹廈OOST_TR1_STD_HEADER(header) (鍦 boost/tr1/detail/config.hpp 涓瀹氫箟)錛屽畠灝嗘墿灞曚負 #include <../include/header>. 瀵逛簬澶у氭暟緙栬瘧鍣錛岃繖鏍峰氨鍙浠ョ洿鎺ヤ嬌鐢錛屼絾鏄榪欐剰鍛崇潃榪欎簺澶存枃浠朵笉鑳借鏀懼湪鍚嶄負"include"涓斿凡鍦ㄤ綘鐨勭紪璇戝櫒鎼滅儲璺寰勪腑鐨勭洰褰曚笅銆
鎬庝箞瑙e喅鍐茬獊闂棰樺憿錛岃繕鏄娌℃湁瀹屽叏寮勬槑鐧斤紝涓嶈繃瑙e喅鍔炴硶榪樻槸google鍒頒簡銆傘 OK 瑙e喅浜嗗氨濂姐傘 浠ュ悗鍐嶈淬
鎸夌悊璇存寜鐓boost/tr1/tuple.hpp 涓鎵鍐欑殑
#ifdef BOOST_HAS_TR1_TUPLE
# ifdef BOOST_HAS_INCLUDE_NEXT
# include_next BOOST_TR1_HEADER(tuple)
# else
# include <boost/tr1/detail/config_all.hpp>
# include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(tuple))
# endif 鎴戝簲璇ュ姞涓涓 #define BOOST_HAS_tR1_TUPLE 灝辮兘瑙e喅闂棰 鍥犱負 BOOST_TR1_HEADER(tuple) 浼氳杞鎹涓 #include <tr1/tuple> 浣嗘槸瀹為獙涓嶆垚鍔熴傘傘傘 usr/include/boost/tr1/tuple.hpp:13:43: error: no include path in which to search for tr1/tuple //WHY 鐭ラ亾涓轟粈涔堢殑甯蹇欏憡璇夋垜涓嬶紝璋㈣阿~ //浼拌″彲鑳芥槸incude_next鐨勫師鍥狅紵 娌″お浠旂粏鐪媔nclude_next浣滅敤TODO 鏈鍚巊oogle鍒扮殑瑙e喅鏂規堟槸#define BOOST_HAS_TR1_TUPLE 1
#include <boost/tr1/detail/config.hpp>
#undef BOOST_HAS_INCLUDE_NEXT //浼間箮鏄闇瑕佸睆钄芥帀 incude_next