1._has_include()
以前自己从没用过 __has_include() 这个宏,其实从字面意义也能猜出其意:可否引入某个文件,它有一个参数,传入的就是想判断的文件名或路径,如果可以引入则返回1,反之则0.
2.FOUNDATION_EXPORT
首先看看 FOUNDATION_EXPORT 的定义:
#if defined(__cplusplus)
#define FOUNDATION_EXTERN extern "C"
#else
#define FOUNDATION_EXTERN extern
#endif
#if TARGET_OS_WIN32
#if defined(NSBUILDINGFOUNDATION)
#define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllexport)
#else
#define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllimport)
#endif
#define FOUNDATION_IMPORT FOUNDATION_EXTERN __declspec(dllimport)
#else
#define FOUNDATION_EXPORT FOUNDATION_EXTERN
#define FOUNDATION_IMPORT FOUNDATION_EXTERN
#endif
可以看出FOUNDATION_EXPORT兼容了win32程序,而我们这里的使用可以把他当做FOUNDATION_EXTERN 就可以了,然后FOUNDATION_EXTERN是兼容了c/c++的,所以如果涉及到c/c++的宏和oc互相使用时,可以用FOUNDATION_EXTERN.
再就是FOUNDATION_EXPORT和 #define 的对比,一般用#define定义一个常量字符串如下:
#define TempString @“tempStr”
当做字符串比较时只能调用比较方法来实现比较:
[TempString isEqualToString:@"tempStr"];
但FOUNDATION_EXPORT可以直接用 ‘==’ 来进行直接比较:
FOUNDATION_EXPORT NSSting *TempString;
比较时:
TempString == @"tempStr";