Почему это не ошибка дублированного символа? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть iOS-фреймворк, содержащий .c, .mm исходные файлы.Для удобства давайте назовем эти два файла A.c и B.mm.

. В обоих файлах я определил функцию с одинаковым протоколом функций, как показано ниже.

// A.c

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

// B.mm

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

НасколькоЯ знаю, я думал, что это вызовет ошибку во время компиляции, потому что есть дублированный символ, но он успешно компилирует структуру без каких-либо ошибок.Что мне здесь не хватает?

Примечание. Это будет duplicate symbol ошибка компоновщика, если это были .c и .m, поскольку Objective-C не подвергается искажению имени.

1 Ответ

0 голосов
/ 05 февраля 2019

Файлы Objective-C ++ (.mm) являются файлами C ++, поэтому они подвергаются искажению имен.Если вы запустите nm на выходе, вы увидите что-то вроде:

$ nm a.out | grep get_file
0000000100000fa0 T __Z8get_filePKc
0000000100000f70 T _get_file

Если вы применили 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)
...