Переопределен макрос SWIFT_NORETURN

В Xcode 12.5 я получаю это, когда пытаюсь скомпилировать свою тестовую цель:

      /Users/user/Development/project-ios/My ProjectTests/My ProjectTests-Bridging-Header.h:7:9: note: in file included from /Users/user/Development/project-ios/My ProjectTests/My ProjectTests-Bridging-Header.h:7:
#import "SpecHelper.h"
        ^
/Users/user/Development/project-ios/My ProjectTests/SpecHelper.h:36:9: note: in file included from /Users/user/Development/project-ios/My ProjectTests/SpecHelper.h:36:
#import "My_Project-Swift.h"
        ^
/Users/user/Library/Developer/Xcode/DerivedData/My._Project-eybfcywypdtewfbihzpxuwyltrxw/Build/Intermediates.noindex/My Project.build/Debug-iphonesimulator/My Project.build/DerivedSources/My_Project-Swift.h:98:10: error: 'SWIFT_NORETURN' macro redefined
# define SWIFT_NORETURN __attribute__((noreturn))
         ^
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.5.sdk/usr/lib/swift/shims/Visibility.h:86:9: note: previous definition is here
#define SWIFT_NORETURN __attribute__((__noreturn__))
        ^
<unknown>:0: error: failed to import bridging header '/Users/user/Development/project-ios/My ProjectTests/My ProjectTests-Bridging-Header.h'
Command MergeSwiftModule failed with a nonzero exit code

Project-Swift.h

      #if __has_attribute(noreturn)
# define SWIFT_NORETURN __attribute__((noreturn))
#else
# define SWIFT_NORETURN
#endif

и Visibility.h

      #if __has_attribute(noreturn)
#define SWIFT_NORETURN __attribute__((__noreturn__))
#else
#define SWIFT_NORETURN
#endif

Примечание: это работает в Xcode 12.4.

Есть идеи, как это обойти?

2 ответа

Попробуйте проверить, что в ваших заголовочных файлах нет строки #import "Project-Swift.h". В идеале только *.m файлы должны включать этот сгенерированный заголовок.

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c

Мне не сразу понятно, почему вы объявляете макрос в разных местах, но должен быть циклический импорт или что-то еще, где он в конечном итоге переопределяется.

Вариант 1 - это рефакторинг кода, так что вы объявляете этот макрос только в одном месте, а затем импортируете его из необходимых мест.

Вариант 2 - обернуть каждое объявление так, чтобы оно не переопределялось:

      #ifndef SWIFT_NORETURN

#if __has_attribute(noreturn)
#define SWIFT_NORETURN __attribute__((__noreturn__))
#else
#define SWIFT_NORETURN
#endif

#endif

Или же:

      #if __has_attribute(noreturn) && !defined(SWIFT_NORETURN)
#define SWIFT_NORETURN __attribute__((__noreturn__))
#else
#define SWIFT_NORETURN
#endif
Другие вопросы по тегам