C/C++
zdyiamdd
这个作者很懒,什么都没留下…
展开
-
关于G++编译的一些问题
<br />今天写了一个小程序,有用到动态链接库。首先,编译一个动态链接库用到的参数是 -shared ,我用的编译是这样的。g++ -shared new.cpp new.h -o new.so,然后再编译 主文件 main.cpp 去链接./new.so ,这样是没问题的,但是呢,路径就被指定了,而且是相对路径,这样的话,程序一放到其它地方就很有可能运行不了了。另一种解决方法就是把new.so给命名为libnew.so,这是默认的命名规范,然后在编译的时候用-L/path指定路径,紧追-lnew ,这原创 2010-06-30 23:23:00 · 483 阅读 · 0 评论 -
这并不是指针,而是函数
#include #include using namespace std;typedef int mytype[2];int(*pFun(int n))[2]{ mytype *k = (mytype*)malloc(sizeof(mytype)) ; (*k)[0] = 1202; (*k)[1] = 1902; return k;}原创 2011-06-14 00:52:00 · 438 阅读 · 0 评论 -
大端与小端
大端表示跟小端表示这两者的具体意义我老是记不住,当然不是说它的意思不懂,而只是容易搞混。现在记一下,以后就比较有印象了。:) 在C++中,定义一个int值的时候,它所占用的内存是4个字节,然而这4个字节里面,我们如果得到这个int值的内存地址,其实就是它的最低位置的地址,如:int a;假设 a的内存分别是 0x0 0x1 0x2 0x3 这4个地址上,每个地址里面存的数是怎样的我们并不知道,只知道总之拿这四个字节去用就是一个值准没错,的确是这样,但是也有例外,当这4个字节跨平台跨机器的时候就会出现问原创 2011-05-25 15:55:00 · 463 阅读 · 0 评论 -
关于静态变量
<br /><br />写了这样一个头文件<br /> <br />"example.h"<br /> <br />class example{<br />public:<br />static int i;<br />static int get(){return i;}<br />};<br />int example::i = 0;<br /> <br />然后很多文件引用到example并调用里面的get()函数,就这样,在链接的时候就出错了。<br />原因是每个文件在编译的时候都把example原创 2010-11-16 20:20:00 · 448 阅读 · 0 评论 -
不要在构造函数或析构函数里调用虚函数
<br />在工作的时候有一次不小心就上了C++这个当,随后又继续看了effective C++,书上内容讲的很不错,所以根据自己的理解记一下,印象更深刻。<br />我对C++的感觉就是做什么事都需要己有意识,稍微一不留神内存就出问题了,如果不知道C++编译器背后做的事的话,很容易会自以为然地写上一些错误的代码,这也许就是经验丰富自的高手与我这种菜鸟的差别了,呵呵,不过菜鸟也会慢慢成长的。嘿嘿<br />在书上讲道为什么编译器要这么做,为什么构造与析构都不能调用虚函数,原因其实很简单:当在实例化一个派生类原创 2011-01-05 00:13:00 · 692 阅读 · 0 评论 -
关于移位运算
#include using namespace std;int main(){ int a=0xfffffff0; cout >=1; cout 结果是:0xfffffff00xffffffe00xfffffff0当有符号位的负数往左移,右边会补上0,但是往右移的时候,左边会补上0原创 2010-12-07 19:20:00 · 362 阅读 · 0 评论 -
__stdcall 与__cdecl两种调用
__stdcall 与__cdecl两种调用当调用一个函数的时候,参数都是从右到左压入堆栈的,它们的之间的不同就是谁来负责管理堆栈的释放。__cdecl是由函数调用者来管理堆栈的释放的,因此才有了可变参数的用法,例如我们常用的printf()函数。当调用printf这个函数的时候,调用者首先会把我们需要用的参数给压到栈里面,然后再调用call指令跳转到代码处执行代码,代码执行完成后跳回call指令的下一条指令来清理之前压到栈里面的参数,具体是怎么清理的呢?很简单,只需要把esp指针pop出我们所压入的参数的原创 2010-09-23 11:55:00 · 478 阅读 · 0 评论 -
template学习笔记
<br /><br />特化与偏特化:<br />特化说白点就是专门为我们指定的一种类型再写一次模板定义,例如:<br />一般情况是这样定义模板的:<br />template<typename T><br />inline T const& add(T const& t1, T const& t2)<br />{<br />return t1+t2;<br />}<br />特化,把我们的add为我们指定一个类型的实现(int):<br />template<><br />inline int cons原创 2010-09-24 17:00:00 · 539 阅读 · 0 评论 -
一个非常可耻的错误
<br />class A{ };class B{ operator A*() const{ return NULL; }};void fun(A* p){}int main(){ B *b = new B; B bb; fun(b); //很明显的ERROR fun(bb); //yes delete b;} <br />之前不知道怎么了这么无耻的错误都犯了。指针只能是算是一个地址,之前脑子总想着原创 2010-09-14 23:17:00 · 391 阅读 · 0 评论 -
类成员函数指针
<br />#include <iostream>using namespace std;class A{public: A():a(100){} void fun(int i){ cout << "this is "<< i << " " << a << endl; }private: int a;};typedef void (A::*myFun)(int);typedef void (*fun)(int);原创 2010-09-10 11:07:00 · 310 阅读 · 0 评论 -
写宏的时候一点
<br /> <br />关于宏的一点东西<br />在平时看C/C++代码的时候,经常会看到宏的定义,而有一些宏是这么写的:<br />#define JUSTFORTEST(x) do{ / if((x)) / dosomething((x)) / }while(0) <br />多出来的do{}while(0)看似多余的,我之前 也是觉得很多余,但是经过在网上一搜,才知道原来这是为了消除有时候由于宏而出现的歧义而作的。<br />比如: <br />#defi原创 2010-08-17 19:10:00 · 300 阅读 · 0 评论 -
由C语言指针想到的
刚接触编程的时候,用的就是C语言,学的时候用的开发软件是Turbo C,很经典的一款IDE了(现在应该没人在用了吧)。刚学习C的时候,主要就是学习其语法,先用一些语法来做出一些简单的小功能,写一些简单的小逻辑。学着学着,就学到了指针了,我记得那本书上讲了,指针是C的核心,学C原创 2011-10-04 00:49:28 · 1072 阅读 · 3 评论