【持续。。更新】总结一下C++开发时的General Principle

0、学习的时候用Editor、Make、Compiler、Linker以及Debugger还有各种工具,了解开发细节。实战的时候用IDE加快开发速度。

  除非你的项目简单到了只需要命令:compiler a.cpp就能生成a.exe。否则,请使用良好的文件组织结构:

    your_project_folder\

      src\

        module_a\

          a.cpp

          ax.cpp

          axx.cpp

        module_b\

          b.cpp

          bx.cpp

          bxx.cpp

      bin\

      lib\

        library_a\

          xxx.lib

          yyy.lib

          zzz.lib

        library_b\

          hhh.lib

          jjj.lib

          kkk.lib

      include\

        library_a\

          iii.h

          uuu.h

        library_b\

          ggg.h

          fff.h

        module_a\

          a.h

          ax.h

          axx.h

        module_b\

          b.h

          bx.h

          bxx.h

  我平时使用的Makefile可以从这里下载到,里面随便一个C++demo下载下来就有Makefile,可以参考(我不是很深入的了解Makefile,所以写的可能有些啰嗦、、不过好歹能用。。。),下面贴上我自己平时用的Makefile模板(配合Visual Studio的NMAKE程序,换到linux下其实也就是改改compiler和linker还有一些其他操作系统相关的指令就能用,差不太多)

  

 1 # compiler
 2 CC = cl
 3 # linker
 4 LINK = link
 5 # libraries
 6 LIB_ZTHREAD = /LIBPATH:E:\cppwksp\zthreaddemo_win\libs\zthread
 7 LIB_SYNC_OUTPUT = /LIBPATH:E:\cppwksp\zthreaddemo_win\demo\C11\531-SynchronizedOutput\lib
 8 # headers
 9 HEADER_PATH = /I E:\cppwksp\zthreaddemo_win\include /I include
10 # options
11 EHSC = /EHsc
12 COMPILATION_ONLY = /c
13 C_OUT = /Fo:
14 L_OUT = /OUT:
15 # compiler & linker debug option, to disable debug, replace ‘/Zi‘ & ‘/DEBUG‘ with empty strings
16 # C_DEBUG = /Zi
17 # L_DEBUG = /DEBUG
18 C_DEBUG = 
19 L_DEBUG = 
20 # targets
21 
22 bin\test.exe: bin lib\SynchronizedOutput_win32.lib obj\SynchronizedOutputTask.obj obj\NormalTask.obj obj\Task.obj obj\main.obj
23     $(LINK) $(L_DEBUG) $(LIB_ZTHREAD) $(LIB_SYNC_OUTPUT) $(L_OUT)bin\test.exe obj\main.obj obj\SynchronizedOutputTask.obj obj\NormalTask.obj obj\Task.obj SynchronizedOutput_win32.lib ZThread_win32.lib
24     
25 lib\SynchronizedOutput_win32.lib: lib obj obj\SynchronizedOutput.obj
26     LIB $(L_OUT)lib\SynchronizedOutput_win32.lib obj\SynchronizedOutput.obj
27 
28 obj\SynchronizedOutput.obj: src\SynchronizedOutput.cpp include\SynchronizedOutput.h
29     $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\SynchronizedOutput.cpp $(C_OUT)obj\SynchronizedOutput.obj
30 
31 obj\main.obj: src\main.cpp include\SynchronizedOutputTask.h include\NormalTask.h include\Task.h
32     $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\main.cpp $(C_OUT)obj\main.obj
33 
34 obj\SynchronizedOutputTask.obj: src\SynchronizedOutputTask.cpp include\SynchronizedOutputTask.h include\Task.h include\SynchronizedOutput.h
35     $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\SynchronizedOutputTask.cpp $(C_OUT)obj\SynchronizedOutputTask.obj
36     
37 obj\NormalTask.obj: src\NormalTask.cpp include\NormalTask.h include\Task.h
38     $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\NormalTask.cpp $(C_OUT)obj\NormalTask.obj
39 
40 obj\Task.obj: src\Task.cpp include\Task.h
41     $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\Task.cpp $(C_OUT)obj\Task.obj
42     
43 # folders
44 
45 bin:
46     mkdir bin
47 
48 obj:
49     mkdir obj
50     
51 lib:
52     mkdir lib
53     
54 # clean
55 # bin, lib, obj folders and pdb files
56 
57 .PHONY: clean
58 clean:
59     -rmdir /s /q bin
60     -rmdir /s /q lib
61     -rmdir /s /q obj
62     -del *.pdb

   关于Makefile,我写了一篇笔记很重要,点此查看

1、头文件的#include顺序:自己写的头文件、第三方工具的头文件、标准头文件,尽量从上到下这样安排顺序

   头文件一定要写上#ifndef xxx #define xxx #endif的header guard

   头文件中除了template和inline以外,都只写declaration不要把implementation代码写在头文件里,免得xxx redefined错误,保持一个好的习惯

2、头文件里不要包含:using指令和using namespace指令

  头文件中不要初始化static member,避免xxx redefined错误,放到cpp文件中去初始化

3、如果你有一个class,尽量为这个class建立一个单独的header文件和cpp文件,需要隐藏实现细节的时候除外

4、待补充。。。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。