小红帽中用eclipse编译windows程序遇到的问题处理备忘录
1.size_t無符號整型變量,size_t has not been declared 解決辦法加頭文件stddef.h
2.expected initializer befor 'a'?
當頭文件無法完成預處理的時候,就會報這個錯誤
http://blog.csdn.net/bbplayers/article/details/6457364
沒有初始化?將頭文件中的導出庫宏定義注釋掉即可,gcc不需要dllexport
3.__int64 has not been declared
__int64 vc特有的8字節64位有符號整型變量
通過typedef long long int __int64;解決,這里注意這不是宏,所以要加;號
如果其他頭文件也需要可以定義ifndef來解決
http://bbs.csdn.net/topics/310135464
http://blog.csdn.net/luxuejuncarl/article/details/1568457
加頭文件stdlib、stddef、stdint都沒有用
注意long int是32位的
《C和指針》中寫過:
long與int:標準只規定long不小于int的長度,int不小于short的長度.
http://bbs.chinaunix.net/thread-1877405-1-1.html
4.純虛函數定義格式如下
純虛函數是一種特殊的虛函數,它的一般格式如下:class <類名>{virtual <類型><函數名>(<參數表>)=0;…}; 在許多情況下,在基類中不能對虛函數給出有意義有實現,而把它說明為純虛函數,它的實現留給該基類的派生類去做。這就是純虛函數的作用。為了解決上述問題,引入了純虛函數的概念,將函數定義為純虛函數(方法:virtual ReturnType Function()= 0;),則編譯器要求在派生類中必須予以重載以實現多態性。同時含有純虛擬函數的類稱為抽象類,它不能生成對象。http://bbs.bccn.net/thread-361400-1-1.html http://blog.csdn.net/tonywearme/article/details/6979283 1、多態性指相同對象收到不同消息或不同對象收到相同消息時產生不同的實現動作。C++支持兩種多態性:編譯時多態性,運行時多態性。a.編譯時多態性:通過重載函數實現b 運行時多態性:通過虛函數實現。2、虛函數虛函數是在基類中被聲明為virtual,并在派生類中重新定義的成員函數,可實現成員函數的動態重載3、抽象類包含純虛函數的類稱為抽象類。由于抽象類包含了沒有定義的純虛函數,所以不能定義抽象類的對象群里網友推介一個非常好的免費自學C++的網站,http://www.cppcourse.com/freelist 加油!三個月時間可以做很多事情,相信你可以的!和考研一樣!努力!抵得住誘惑耐得住寂寞!規劃好,兩期! 抽象類不能定義對象,但是抽象類可以定義指針,指針指向派生類 抽象類中定義的指針只能訪問純虛函數和虛函數,其他函數沒有訪問權限! Never call virtual functions during construction or destruction: http://www.cnblogs.com/Pony279/archive/2013/06/04/3117955.html 看到兩篇講虛函數的文章:
http://bbs.bccn.net/thread-361400-1-1.html
http://blog.csdn.net/tonywearme/article/details/6979283
4.Linux下Eclipse編譯時,報recompile with -fPIC錯誤:
http://blog.csdn.net/shenchen8274/article/details/7822822
-fPIC 作用于編譯階段,告訴編譯器產生與位置無關代碼(Position-Independent Code),
??則產生的代碼中,沒有絕對地址,全部使用相對地址,故而代碼可以被加載器加載到內存的任意
??位置,都可以正確的執行。這正是共享庫所要求的,共享庫被加載時,在內存的位置不是固定的。
不用fPIC編譯so并不總是不好.
如果你滿足以下4個需求/條件:
1.該庫可能需要經常更新
2.該庫需要非常高的效率(尤其是有很多全局量的使用時)
3.該庫并不很大.http://blog.sina.com.cn/s/blog_54f82cc201011op1.html
4.該庫基本不需要被多個應用程序共享
http://blog.sina.com.cn/s/blog_54f82cc201011op1.html(正解)
http://blog.csdn.net/bailyzheng/article/details/17613435
http://zhidao.baidu.com/link?url=EYPglPT3EHm1cPvPdaeFGJthgWEze1ZNFQH6erZzZI59uZCAbFEmaKelrQI1fEWjg7uQOnqD-UpucyEkFwTa6a
-f后面跟一些編譯選項,PIC是其中一種,表示生成位置無關代碼(Position Independent Code)
5.abs(),fabs()函數
template <class T>
inline T& abs(T& a)
{
return a < 0 ? -a : a;
}模板形式的函數自定義
abs();查看了一下gcc的庫函數位于stdlib.h(http://blog.163.com/ywx209100@126/blog/static/362968912009814105614924/):
extern int abs(int _x)_THROW _attribute_ ((_const_))_wur;
_THROW為throw()函數的宏定義。_wur是/*ingnore*/的宏定義
throw()是異常直接中斷,不會理會外部捕獲函數,throw(int)只會捕獲int型的異常,http://blog.csdn.net/eclipser1987/article/details/7997286
http://blog.csdn.net/zdl1016/article/details/4204025
vc++中abs()針對整型變量,fabs針對浮點型變量,查看源windows程序參數定義類型為double,故改用fabs(),這個函數在math.h中。
6在C++里Include C的頭文件,就需要在原來的.h文件前加個c,并去掉.h;c++頭文件include <cstdlib>對應c中的include <stdlib.h>頭文件。
string.h ? cstring.h ?<string>
http://www.cnblogs.com/Cmpl/archive/2012/01/01/2309710.html
頭文件string與string.h的區別
<string>是c++?的頭文件,其內包含了一個string類,string?s1就是建立一個string類的對象?<string.h>?的c語言的東西?并無類,所以不能?string?s1?
<cstring>文件實際上只是在一個命名空間std中include了?<string.h>;以前的C的頭文件轉化為C++的頭文件后,有時加上c的前綴表示來自于c,例如cmath就是由math.h變來的。
更加一般的是:
當使用<iostream.h>時,相當于在c中調用庫函數,使用的是全局命名空間,也就是早期的c++實現;當使用< iostream>的時候,該頭文件沒有定義全局命名空間,必須使用namespace std;這樣才能正確使用cout。命名空間std封裝的是標準程序庫的名稱
void *memset(void *s, int ch,?size_t?n); 函數解釋:將s中前n個字節 (typedef unsigned int size_t )用 ch 替換并返回 s 。 memset:作用是在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法[1]。用于初始化 提示找不到標識符memset,那么少了sting.h,但是<string>要同時使用,因為使用到了string類所以兩個頭文件必須加,但是<cstring>的話必須使用using namespace std;
另外補充一點的是:“”和<>什么時候用:
""首先搜索當前目錄,當前目錄沒有,再搜索頭文件的標準目錄. <>只搜索頭文件的標準目錄7
C++標準庫沒有提供針對 string 對象的 tolower 函數,
標準庫的 tolower 函數是針對單個字符而非針對 string 的,c++者中有一個函數tolower。這個函數是處理字符串的函數。將大寫轉換成小寫.大寫是指ABCDEFGHIJKLMNOPQRSTUVMXYZ轉換后變成abcdefghijklmnopqrstuvwxyz。非字母字符不做出處理。比如1 2 3 !等字符是以原字符輸出的頭文件:在VC6.0可以是ctype.h或者stdlib.h。當然這個函數用法有點特殊他是處理字符的,而不是處理字符串的。所謂的不能處理字符串不是說他不能處理字符串,他處理的時候對字符串必須是一個一個字符處理的,不能一次性對字符串進行處理 重載一個函數| 1 2 3 4 5 6 | std::string?tolower(?std::string?str?) { ????for(unsigned?i?=?0;?i?<?str.length();?i++) ????????str[i]?=?std::tolower(str[i]); ????return?str; } |
8函數名加括號是為了防止宏擴展http://blog.csdn.net/simonjay2007/article/details/7406795
函數返回值可以是一個函數對象http://www.douban.com/group/topic/13717915/?cid=154376451(還是不太理解函數參數的問題?),閉包形式:http://baike.baidu.com/link?url=Vz7YSkauS_2z0JuM7vBsZOYDrGdB-Ws5XSAYO-BeHryuNKvzNB5QaUjIAJIsAfapORqsCfEJ-kqSGcTXthMAAK
1、保護函數內的變量安全。以最開始的例子為例,函數a中i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。 2、在內存中維持一個變量。依然如前例,由于閉包,函數a中i的一直存在于內存中,因此每次執行c(),都會給i自加1。 以上兩點是閉包最基本的應用場景,很多經典案例都源于此。 回收機制 在Javascript中,如果一個對象不再被引用,那么這個對象就會被GC回收。如果兩個對象互相引用,而不再被第3者所引用,那么這兩個互相引用的對象也會被回收。因為函數a被b引用,b又被a外的c引用,這就是為什么函數a執行后不會被回收的原因 8.:: ::是運算符中等級最高的,它分為三種:全局作用域符,類作用域符,命名空間作用域符。他們都是左關聯(left-associativity)。他們的作用都是為了更明確的調用你 全局作用域符號:當全局變量在局部函數中與其中某個變量重名,那么就可以用::來區分如:
“transform(s.begin(),s.end(),s.begin(),tolower)” can't be complied successfully?
http://stackoverflow.com/questions/5539249/why-transforms-begin-s-end-s-begin-tolower-cant-be-complied-successfu不加::同時invalid overload of tolower,有重名的情況,加上::后編譯通過 9.移植時,一定要格外注意大小寫,linux下是有嚴格要求的。.否則頭文件可能找不到。 9. typedef long long int __int64; typedef unsigned __int64 timetype; gcc中報錯vs中可以 只能改成typedf unsigned long long int __64; 具體原因仍然不詳。。。 10看到enum struct 這些類型都可以加宏 XX_API(導出的dll),我像一個沒見過世面的 大猩猩 11.extern "C"用來實現C++與C及其它語言的混合編程; http://baike.baidu.com/link?url=Sr6Gaa3iEP0gFH0EJ3VzqDJvVydx37kJm4vl6ceS3Oc3adCNvHjZba-JiTQ6XxWiTOfjBPvstFR-YTHBMRcDTq
總結
以上是生活随笔為你收集整理的小红帽中用eclipse编译windows程序遇到的问题处理备忘录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BEV最新综述 | 学术界和工业界方案汇
- 下一篇: 图元和片元_顶点(vertexs) 图元