Использование встроенной функции C невозможно в инициализаторе, отмеченном через NS_DESIGNATED_INITIALIZER - PullRequest
0 голосов
/ 10 октября 2018

Скажем, у меня есть такой класс

// 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.

Итак, мой текущий вывод

  1. Если DummyObject скомпилирован как Objective-C (.m), то" inlinefoobar "не будет работать
  2. Если DummyObject скомпилирован как Objective-C ++ (. mm), то" inline foobar "работает нормально
  3. Если я удалю ключевое слово" inline ", то" foobar"отлично работает как в Objective-C, так и в Objective-C ++
  4. " static inline static_foobar "всегда работает

Это довольно запутанно, я проверил документацию Clang безуспешно.Это было в моей голове около 2 дней, любые предложения помогут ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...