案情回顾
项目中因为一个功能使用了某两个功能有交集的第三方SDK,都是.a的静态库【我觉得这就是编译器没有发现问题的重点】。在实战中发现,有一个SDK总是不可用,而且和引入SDK的先后顺序有关。这种bug,简直了。
幸好(通过正常途径)搞到其中之一的源码,找了半天,把怀疑对象锁定在某个.c的文件里。配合着控制台日志,几番分析比对。最后锁定了其中的一个函数,对,就是下面这样子声明:
unsigned char* getTheDataBuffer(char *command, int *p);
从log来看,在程序该调用此函数的时候并没有执行此函数代码,log里还有两行很奇怪的输出在可见的源码里找不到,推测来自另一个静态库里,而且和调用此函数的行为有关。在函数内断点,验证猜想。最好把这个函数名改一下,解决这个bug。
猜测是那个静态库里也有同名函数,但是因为是静态库,所以编译器没有检查到重复,所以只在运行时出现意外。也有可能是其他的一些编译器特性造成的,这里面细节我不清楚,感兴趣的了解下关于C和CPP中同名函数的思考。
C语言 在不同的.c 文件中可以定义相同名称的函数吗
在某度搜索了下,看到这样的一个问题,我觉得是不行的,但是原理说不上来。测试下了,编译器那一关就过不了。
// main.m
#import <Foundation/Foundation.h>
#import "test_a.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
testCXXXPrintf(10);
}
return 0;
}
// test_a.h
#ifndef test_a_h
#define test_a_h
#include <stdio.h>
void testCXXXPrintf(int a);
#endif /* test_a_h */
// test_a.c
#include "test_a.h"
void testPrintf(int a);
void testCXXXPrintf(int a) {
testPrintf(a);
}
void testPrintf(int a) {
printf("----test_a :: %d\n",a);
}
// test_b.h
#ifndef test_b_h
#define test_b_h
#include <stdio.h>
void testCXXXPrintf(int a);
#endif /* test_b_h */
// test_b.c
#include "test_b.h"
void testPrintf(int a);
void testBXXXPrintf(int a) {
testPrintf(a);
}
void testPrintf(int a) {
printf("----test_b :: %d\n",a);
}
build结果如图:
build 2019-02-27 11.45.48.png
这里只是记录了我怎么爬这个坑的过程,哪位兄弟要是熟悉编译原理,还望指点一二。
网友评论