㈠ “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