如果你有多年C语言编程经验的话,相信对C语言的命名冲突应该不陌生。本文结合个人一些经验讨论一下命名冲突的问题。 首先讲一下命名冲突的由来。C语言中所有的符号名称都定义在一个全局命名空间中。这样符号名称,中间文件名称(.o文件或者.obj文件)都可能会冲突。 根据我的经验,如下情况下容易产生C语言命名冲突:

1、当系统只有一个模块的时候,命名冲突的问题不太严重。当系统有N个模块之后,很难保证不发生命名冲突。如果代码是我们自己编写的,可以通过良好的编程习惯来避免这个问题。

2、但是如果你的系统中有多个开源库的话,就非常容易产生命名冲突的问题了。因为这些开源库是不同人编写的,他们可能遵循的不同的命名规则。

3、另外一种非常容易产生命名冲突的情况是:如果你的系统有一部分是C语言实现的闭源的静态库或者动态库(有可能是第三方提供的库,或者是合作伙伴提供的库),没有源码,你就很难避免命名冲突了。

上文讨论了产生C语言命名冲突的几种常见情况,难免有遗漏,欢迎补充。那么怎样解决这些命名冲突问题呢? 对于第一种情况,解决比较简单,因为所有的代码都是自己开发的。只要制定严格的命名规则和开发人员具有良好的编程习惯就可以避免。 对于第二种情况,如果多个开源库有命名冲突的话,没有办法只能修改开源库的代码,比较好的做法是定义宏来完成符号的替换,这样代码改动最少,也易于维护。举个例子说明这个问题,加入说系统中两个开源库中free函数命名冲突了,需要修改一个库的符号。怎样实现呢?

1、首先定义一个头文件,假设为redefine.h,在头文件中加入如下定义: #define free my_free

2、然后在使用和定义free的源文件中包含redefine.h头文件。这样库中所有的free符号,全部变成了my_free,并且不需要修改开源库的代码。

对于第三种情况,就比较困难了,因为有一部分库是没有源码的。如果你的系统中只有一个闭源的静态库或者动态库。这个问题还是相对比较容易解决的。可以通过上面的办法修改有源码的库的符号。举一个比较极端的例子,假如闭源动态库或者静态库中包含有某个库(比如ligjpeg),那么你的系统代码中也有这个库,那么将会产生命名冲突。怎么解决呢?你可能可以把自己的libjpeg拿掉,用静态库中的。静态库中的libjpeg代码是看不到的,你不知道库的提供者有没有对其进行改变。所以比较能接受的做法还是用上面提到方法把你的系统用的的libjpeg的符号都重新定义一下。自己还是调用自己的libjpeg,不要依赖库里面的libjpeg。 如果你的系统中两个闭源的库命名冲突了,那么你的麻烦就大了。只能想办法修改一个闭源库,这可能涉及到其他部门的协调问题,开发人员不可控。 如果系统中有两个相同的.o文件(也就是系统中文件名冲突了,有两个相同名称的.c文件)会有什么结果呢?系统随机link一个.o到最终的目标文件中,并且不会产生错误和警告提示。这种情况非常难发现。需要经验和敏锐的洞察力。解决方法有两个:

1、重命名其中的一个.c文件。这样就会产生不同的.o文件,两个.o文件都会被link到最终的目标文件中。

2、修改一个库的Makefile文件,让其生成的.o文件加一个前缀或者后缀(需要研究自己系统的Makefile写法)。 以上讨论都是出于个人经验,难免有所偏颇,请各位指正。