C 如何检查和避免函数在一个静态库中具有相同的名称?

C 如何检查和避免函数在一个静态库中具有相同的名称?,c,C,在C/C++中创建具有相同函数名和参数列表但在不同源文件中实现的静态库时,我会感到困惑 比如说,我在test.h中声明了play()功能,并在test.c和test\u old.c中实现了play()。当以通常的方式创建同时包含test.c和test\u old.c的库时,不会出现错误 但这会让人们在使用这个库时感到困惑。如何检测此复制的实现?谢谢。在静态库中复制函数名是非常不好的做法。不要这样做 也就是说,您可以通过检查nm应用程序的输出来检查重复的定义 $nm libstest.a 测试1.

在C/C++中创建具有相同函数名和参数列表但在不同源文件中实现的静态库时,我会感到困惑

比如说,我在
test.h
中声明了
play()
功能,并在
test.c
test\u old.c
中实现了
play()
。当以通常的方式创建同时包含
test.c
test\u old.c
的库时,不会出现错误


但这会让人们在使用这个库时感到困惑。如何检测此复制的实现?谢谢。

在静态库中复制函数名是非常不好的做法。不要这样做

也就是说,您可以通过检查
nm
应用程序的输出来检查重复的定义

$nm libstest.a
测试1.c.o:
0000000000000000吨bla
测试2.c.o:
0000000000000000吨bla
以下命令列出了库中的重复函数:

$nm libstest.a | grep-P“^[^\\s]+T”| cut-d'-f3 | sort | uniq-d

<问题> C,而不是C++。在C中,一个(简单的)库只是一堆对象文件。一个简单的库管理器(可能)并不关心多定义的符号。链接时,可能会报告问题,或者愚蠢的链接器只接收它遇到的第一个符号(带有该符号的对象),而忽略其余符号。当然,可以有更聪明的LIB管理器和链接器。@ PaulgiViy是的,你是对的,我在这个例子中构建了一个纯C库,并且它从我的实际项目/源文件中简化,其中包括C和C++文件。它们有着相同的行为(在静态库中有着相同的功能,没有错误或警告)。@PaulOgilvie你提到“更聪明的库管理器和链接器”是什么意思?你是说clang v.s.gcc吗?谢谢你的回复,这很有效。但我也很好奇,在构建静态库时,我是否可以检查它,例如,一些标志传递给GCC编译器。据我所知不是这样。这个问题比你想象的要少见得多。在更大的项目中,不会有一个名为
play()
的函数。例如,如果使用
play()
启动声音文件的播放,它将被称为
sound\u start\u playback()
audiofile\u play()
。项目结构应确保函数位于哪个文件中,并且gcc将确保单个文件中没有重复的函数。