首页 > 代码库 > 【持续。。更新】总结一下C++开发时的General Principle
【持续。。更新】总结一下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 include10 # options11 EHSC = /EHsc12 COMPILATION_ONLY = /c13 C_OUT = /Fo:14 L_OUT = /OUT:15 # compiler & linker debug option, to disable debug, replace ‘/Zi‘ & ‘/DEBUG‘ with empty strings16 # C_DEBUG = /Zi17 # L_DEBUG = /DEBUG18 C_DEBUG = 19 L_DEBUG = 20 # targets21 22 bin\test.exe: bin lib\SynchronizedOutput_win32.lib obj\SynchronizedOutputTask.obj obj\NormalTask.obj obj\Task.obj obj\main.obj23 $(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.lib24 25 lib\SynchronizedOutput_win32.lib: lib obj obj\SynchronizedOutput.obj26 LIB $(L_OUT)lib\SynchronizedOutput_win32.lib obj\SynchronizedOutput.obj27 28 obj\SynchronizedOutput.obj: src\SynchronizedOutput.cpp include\SynchronizedOutput.h29 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\SynchronizedOutput.cpp $(C_OUT)obj\SynchronizedOutput.obj30 31 obj\main.obj: src\main.cpp include\SynchronizedOutputTask.h include\NormalTask.h include\Task.h32 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\main.cpp $(C_OUT)obj\main.obj33 34 obj\SynchronizedOutputTask.obj: src\SynchronizedOutputTask.cpp include\SynchronizedOutputTask.h include\Task.h include\SynchronizedOutput.h35 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\SynchronizedOutputTask.cpp $(C_OUT)obj\SynchronizedOutputTask.obj36 37 obj\NormalTask.obj: src\NormalTask.cpp include\NormalTask.h include\Task.h38 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\NormalTask.cpp $(C_OUT)obj\NormalTask.obj39 40 obj\Task.obj: src\Task.cpp include\Task.h41 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\Task.cpp $(C_OUT)obj\Task.obj42 43 # folders44 45 bin:46 mkdir bin47 48 obj:49 mkdir obj50 51 lib:52 mkdir lib53 54 # clean55 # bin, lib, obj folders and pdb files56 57 .PHONY: clean58 clean:59 -rmdir /s /q bin60 -rmdir /s /q lib61 -rmdir /s /q obj62 -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、待补充。。。
【持续。。更新】总结一下C++开发时的General Principle