C++项目目录组织结构

Posted Leave a commentPosted in Lang

项目目录结构的问题基本上是个仁者见仁,智者见智的问题,只要自己用着顺手,使用什么样的目录组织结构是没有什么大碍的。当然如果项目很大,参与的人员很多,那么合理的组织一下目录结构还是会有很大的益处的。不同类型的项目也会有不同的目录结构,这里简单的展示一下我所使用的C++项目的基本目录结构。 project —+—build—+—debug      |     |—release      |—dist      |—doc      |—include—+—module1      |      |—module2      |—lib      |—module1      |—module2      |—res      |—samples—+—sample1      |      |—sample2      |—tools      |—copyleft      |—Makefile      |—README      |— …

C/C++ static语义(semantics)

Posted Leave a commentPosted in Lang

  static可以用来修饰变量(variant)和函数(function)。但static作用于普通变量/函数与类(calss)变量/函数的语义是不一样的。   static有两种基本的语义,第一种是存储方式(storage),这种语义只作用于变量,不适用于函数,第二种是访问控制(Access Control)。   用static修饰一个普通变量有两层含义。其一是表示该变量的值在超出作用域范围后仍然有效,一般编译器将static变量放置到全局静态存储区,比如.data或.bss(Block Started by Symbol)节,这就是存储方式语义。其二是表示该变量只在声明的作用域范围内可以被访问,比如, 声明在一个文件作用域内的变量不能被其他文件访问,这就是访问控制语义。   用static来修饰普通函数的时候则只有一种语义,即访问控制,因为无论如何,函数总是要被编译器放置到.text节的。也就是说用static修饰的普通函数不能被其他文件内的代码访问。   C++中用static来修饰成员变量和函数的语义稍有不同,其含义表示这些变量或函数是属于整个类(class)而不特定于任何一个该类的对象(object),即使该类没有一个对象产生,仍然可用使用类来访问这些变量和函数。这是C++对C static语义的扩展。

关于C和C++的布尔类型,_Bool和bool

Posted 2 CommentsPosted in Lang

C++内置对布尔类型的支持,其关键字是bool,C语言直到C99标准才增加了对布尔类型的支持,关键字为_Bool,因为bool已经被C++ 用了,所以选了这个十分奇怪的关键字。在这之前C程序员对布尔类型的模拟是相当混乱的。为了在C和C++程序中以统一的方式使用布尔类型,同时提高可移植性,可以采用下面的方式:

Visual C++ 2008 Express编译boost 1.39 regex库遇到的问题及解决办法

Posted 1 CommentPosted in Lang

最近在玩boost,用vc++ 2008 express编译最新版本1.39时遇到一点小问题,记录于此。 分别下载了zlib,bzip2和icu,python暂时不玩,没接触过。我喜欢静态链接程序,根据官方文档的提示,在console输入如下指令,为了输入方便,最好写个bat脚本: bootstrap bjam -sBZIP2_SOURCE=D:/libs/bzip2-1.0.5 -sZLIB_SOURCE=D:/libs/zlib-1.2.3 -sHAVE_ICU=1 -sICU_PATH=D:/libs/icu link=static runtime-link=static threading=multi –without-python console窗口一阵晃动后吐出了这么三行error: error: link=shared together with runtime-link=static is not allowed error: such property combination is either impossible error: or too dangerious to be of any use 百思不得其解,明明我的link选项只有static,哪来的shared啊,郁闷啊郁闷,反复折腾后,发现,如果没有ICU选项,则不会出现此错误提示。 用vim打开boost_1_39_0\libs\regex\build\jamfile.v2,搜索一下/\<shared\>,果然在文件底部,218,223和229行链接选项被写死为shared。那就去掉这该死的shared,重新来过,bjam终于开始正常工作了。 编译带ICU选项的regex还会遇到一点儿小问题。boost.regex期望的icui18n.lib和icudata.lib与编译后的ICU库的名字并不相同,简单修改一下就可以了,如下: libs\icu\lib\icuin.lib -> icui18n.lib libs\icu\lib\icudt.lib -> icudata.lib 测试了boost 1.39官方文档的regex测试程序,静态链接,一切OK。