小红帽中用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






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值