Скажем, у меня есть такой класс
// DummyObject.h
@interface DummyObject : NSObject
- (instancetype)initWithFoo:(NSString *)foo
NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
@end
и
// DummyObject.m
inline void
foobar() {}
static inline void
static_foobar() {}
@implementation DummyObject
- (instancetype)initWithFoo:(NSString *)foo
{
if (self = [super init])
{
// Undefined symbols for architecture x86_64:
// "_foobar", referenced from:
// -[DummyObject initWithFoo:] in DummyObject.o
foobar();
static_foobar(); // Works as expected
}
return self;
}
@end
Мое понимание inline заключается в том, что он просто предлагает компилятору встроить функциютело в вызывающий код вместо выполнения фактического вызова.И static относится к области, что означает, что я могу использовать эту функцию только внутри файла, который ее определяет.
Обновление 1:
Согласно комментарию trungduc, "inline foobar "работает после изменения DummyObject.m на DummyObject.mm.
Итак, мой текущий вывод
- Если DummyObject скомпилирован как Objective-C (.m), то" inlinefoobar "не будет работать
- Если DummyObject скомпилирован как Objective-C ++ (. mm), то" inline foobar "работает нормально
- Если я удалю ключевое слово" inline ", то" foobar"отлично работает как в Objective-C, так и в Objective-C ++
- " static inline static_foobar "всегда работает
Это довольно запутанно, я проверил документацию Clang безуспешно.Это было в моей голове около 2 дней, любые предложения помогут ...