@class против #import в экономии времени компиляции заголовка с Clang? - PullRequest
3 голосов
/ 01 сентября 2011

В нескольких местах я прочитал, что желательно использовать объявления типа @class Something в заголовочных файлах и импортировать только эти классы в файл .m для экономии времени компиляции.

Действительно ли это все еще необходимо и ускоряет компиляцию с помощью LLVM Clang, или преимущество времени компиляции действительно только для более старых компиляторов, таких как (старые версии) GCC?

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Случайно вы можете получить круговой импорт:

// A.h
#import "B.h"

// B.h
#import "A.h"

Препроцессор будет включать B.h в A.h, который, в свою очередь, включает A.h (потому что B.h импортирует его), который, в свою очередь, снова импортирует B.h и т. Д. До бесконечности.

@class операторы предотвращают эту случайную ошибку, поскольку ошибка, вызванная циклическим импортом, действительно ДЕЙСТВИТЕЛЬНО неинтуитивна (если исходить из личного опыта и проверок следов / ошибок).

2 голосов
/ 01 сентября 2011

@ Eimantas прав насчет круговых зависимостей.Это также для производительности.Представьте себе случай, когда вы импортируете A.h в B.h и B.h в C.m.Теперь каждый раз, когда вы изменяете A.h, C.m перекомпилируется, даже если C.m может ничего не полагаться на A.h.Использование @class позволяет избежать такого оттока сборки.Переход к лязгу не меняет этого.

Обратите внимание, что это относится только к заголовкам, которые вы можете изменить.Как правило, это нормально и предпочтительнее импортировать системные заголовки непосредственно в файлы .h.

...