Почему extern "C" работает только внутри файла, который нужно включить, а не когда он заключен в директиву #include - PullRequest
1 голос
/ 27 февраля 2011

Я включаю файл C с именем "AniUtils.h" в класс Objective C ++.Я понимаю, что мне нужно использовать 'extern "C", если я собираюсь включить файл C в файл C ++.Что меня смущает, так это то, что перенос директивы include в extern C, похоже, не работает, тогда как вставка extern C в тело файла делает это так.1003 *

extern "C" {
    #include "AniUtils.h"
}

Тем не менее, выполнение этого способа работает нормально:

// AniUtils.h
#ifdef __cplusplus
extern "C" {
#endif

// body of included file

#ifdef __cplusplus
}
#endif

Почему работает второй подход, а не первый?

Ответы [ 4 ]

1 голос
/ 27 февраля 2011

Если ваш AniUtils.h файл включен другими любыми другими Objective-C классами (например, .m файлы; не Objective-C ++, .mm файлы), то первым способом, который вы реализовалиextern C оператор вызовет ошибки.

Например, вот простой класс Objective C, который будет импортировать проблемный класс AniUtils.h Objective-C ++.Обратите внимание, что поскольку эти файлы WowClass.h & WowClass.m, эти файлы будут обрабатываться как обычный Objective-C:

WowClass.h:

#import <Foundation/Foundation.h>
#import "AniUtils.h"

@interface WowClass : NSObject {

}

@end

WowClass.m:

#import "WowClass.h"

@implementation
 .....
@end

Теперь, если ваш AniUtils.h определен первым способом, вы получите ошибки при попытке обработать файл WowClass.m, который включает в себя оператор extern C, как обычный Objective-C.Вместо этого вам нужно обусловить оператор extern C в AniUtils.h:

// AniUtils.h
#ifdef __cplusplus
extern "C" {
#endif

// body of included file

#ifdef __cplusplus
}
#endif

Конечно, альтернативой может быть простое переименование WowClass.m в WowClass.mm, чтобы интерфейс WowClass иФайлы реализации всегда обрабатываются как Objective-C ++, но в этом вопросе упущено.

0 голосов
/ 27 февраля 2011

Включаете ли вы AniUtils.h в файл .cpp?Во втором случае он также увидит внешнюю букву «С», но не в первом случае.

0 голосов
/ 27 февраля 2011

Возможно, AniUtils.h включен и в другой файл.

0 голосов
/ 27 февраля 2011

Хм, должно работать.Вы уверены, что AniUtils.h скомпилирован с компилятором C, а не с C ++?Существует действительно подробное описание всей проблемы, посмотрите здесь, возможно, это поможет вам.

http://de.w3support.net/index.php?db=so&id=67894

...