为什么这不是重复的符号错误?

slo*_*low 1 c xcode compiler-errors duplicate-symbol

我有一个iOS的框架,包含.c,.mm源文件.为方便起见,我们姑且称之为这两个文件A.cB.mm.

在这两个文件中,我定义了一个具有相同功能协议的函数,如下所示.

// A.c

uint32_t get_file(const char *path)
{
    ...
}

// B.mm

uint32_t get_file(const char *path)
{
    ...
}

Run Code Online (Sandbox Code Playgroud)

据我所知,我认为这会在编译时抛出错误,因为有重复的符号,但它成功编译框架没有任何错误.我在这里错过了什么?

注意:duplicate symbol如果它是一个链接器错误,.c并且.m因为Objective-C没有经过名称修改.

Rob*_*ier 5

Objective-C++文件(.mm)是C++文件,因此它们经历了名称修改.如果你nm在输出上运行,你会看到以下内容:

$ nm a.out | grep get_file
0000000100000fa0 T __Z8get_filePKc
0000000100000f70 T _get_file
Run Code Online (Sandbox Code Playgroud)

如果你extern "C"在C++版本中应用了删除名称修改,你会看到你期望的碰撞:

// B.mm
extern "C" uint32_t get_file(const char *path)
{
    return 0;
}


$ clang A.c B.mm
duplicate symbol _get_file in:
    /var/folders/j3/32xftcp56c12hqz7y8rl4f600000gn/T/A-d00e10.o
    /var/folders/j3/32xftcp56c12hqz7y8rl4f600000gn/T/B-d853af.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)