Ответ 1
Это для меня похоже на ошибку. Этот простой случай показывает ту же ошибку:
inline void foo() {}
int main() {
foo();
}
Урожайность:
$ clang test-inline.c
Undefined symbols for architecture x86_64:
"_foo", referenced from:
_main in test-inline-MfUY0X.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Это должно быть неправильно!? Если я вообще не пропущу что-то о inline
.
Изменить: О нет, подождите, проверьте это - http://clang.llvm.org/compatibility.html#inline
В принципе, я тоже не понял inline
. И ни один человек не написал этот образец кода в Apple!
inline
в функции ChangeBits
означает, что это определение должно использоваться только для inline. Не то, чтобы функция всегда была встроена. Должно быть другое, не встроенное определение, доступное в другом месте приложения, в противном случае оно является незаконным. Следовательно, ошибка связи, так как отсутствует не встроенный ChangeBits
.
Реальное решение состоит в том, чтобы объявить ChangeBits
как static inline
, поскольку это говорит компилятору, что определение является локальным только для этой единицы перевода, и поэтому не обязательно должно быть нестрочное определение.
Более подробную информацию о странице LLVM, с которой я связан, есть. Надеюсь, что это поможет!