Prefix.pch: 如何不对某些文件使用它?

Prefix.pch: how to not use it for certain files?

如何避免我的 prefix.pch 文件中给出的导入语句被添加到名为 VMKChilkatWrapper.h 的某个 .h 文件中?

我试过以下方法:

#if !__has_include("VMKChilkatWrapper.h")
#if !strcmp(__FILE__, "VMKChilkatWrapper.h")
#if !strcmp(__BASE_FILE__, "VMKChilkatWrapper.h")

但即使经过几个小时的尝试,我还是无法让它工作。这可能吗?

我为什么要这样做?

我有几个 .mm 个文件 (Objective-C++)。当我将 Objective-C classes 导入其中时,我无法再使用 @import

因此,我创建了一个包装器 class,这是唯一 class 导入到我的 .mm 文件中的包装器。

我还在我的 Prefix.pch 文件中使用 #ifdef __OBJC__ 以避免我的 Objective-C 头文件被导入到我的 .mm 文件中。

但是,#ifdef __OBJC__ 不会阻止我的 Prefix.pch 文件被包含在 VMKChilkatWrapper 中。因此,@import 指令不适用于我的 Prefix.pch 文件中的任何文件。

目前,我认为最好的解决方案是删除我的 Prefix.pch 文件中的导入语句。

你不能。

前缀header在编译之前添加到每个实现文件。目前没有关于该文件中包含的其他 header 个文件的信息可用。

如果你需要这个,那你就做错了。 prefix headers 的唯一目的是通过预编译一些框架 headers 来加快编译速度。只需在其中添加内容,以便在每个实现文件中可用,就是 anti-pattern.

我建议不要使用 @import。使用旧时尚 #import。 如果你对此有困难,那么只在你需要的地方使用 @import,比如 Swift.

还有一种可能的解决方案。 将你的导入放在 #ifdef __OBJC__ #ifndef __cplusplus #endif #endif 块中。 例子

#ifdef __OBJC__
#ifndef __cplusplus
@import ...
#endif
#endif