注意编程规范
最近要将一个算法应用到分布式系统中,以前由于急着想实现这个算法(涉及到矩阵),于是就使用了C++的stl(用了string和vector),主要是方便二维数组参数的传递以及数组长度的自动管理,后来很方便的实现了。
三天前开始把算法往系统中移植,问题来了。系统全部用C写的,算法模块用C++实现的,于是又一下几种方式:
1,将整个系统用g++重新编译成c++程序,因为系统与文件系统有关,而kernel完全由C实现,所以不做考虑。
2,C语言调用C++的函数?? google了一下,的确有这种方法(参看:http://tzc.is-programmer.com/posts/551.html),但程序由windows移植到linux后一直编译/链接有错误。
3,只能做最坏的打算了,用C语言重写算法。
花了一天半的时间,把算法用C实现了一个功能精简版本。(用一维数组模拟了二维数组,避免了复杂的二维指针传递的限制和复杂性)
当我要把代码移到linux下用gcc编译时,又出现问题了,提示跟前两天编c++的程序一样,大致意思是某某东西被多次定义了,检查了几分钟,终于发现问题。
问题所在:
有以下文件 xx.h xx.c main.c
在windows下,由于我没有建工程main.c不回主动链接xx.o,所以为了方便调试,我在main.c里加了#include "xx.c", 于是顺利通过。
在linux下,我使用 gcc -o main main.c xx.c 于是问题出现了重新定义之类的error一大堆,检查的过程中我想到main.c中包含了xx.c,于是我想到两种解决方法:
1,在main.c去掉#include "xx.c"
2,使用gcc -o main main.c
实践证明,二者皆可行。
于是回过头调C++的程序,马上pass了。。。。。。两天的时间就这样被我浪费了,主要是平时编程没有注意规范。
注意的问题:
在预编译时,#include指令将包含的头文件的内容结合预处理指令扩展到源文件中,在头文件中最好只包含声明(不是必须,不要包含头文件),在同名(方便管理)的源文件中的一些声明(需要包含头文件,生成目标文件时需要有语法检查),在main.c中包含.h 即可编程。
头文件应该放些什么?
1,宏定义 结构体,联合体,枚举的声明 typedef声明 外部函数声明 全局变量声明
2,当声明或宏定义需要在多个文件中共享时,尤其需要把他们加入到头文件。
3,永远不要把外部函数原型(即外部函数声明)放到.c文件中。
4,如果一个宏或声明为一个.c文件按私有,最好放在.c文件中。