如何限制使用的预处理定义的范围?

时间:2013-08-06 10:00:54

标签: objective-c c gcc macros clang

如何使用clang(或gcc)预处理器预处理代码库,同时限制其文本处理仅使用单个头文件中的#define条目?

这通常很有用:想象一下你想要预览当前正在处理的某些宏的直接结果......而不会产生由C所固有的包含的大量杂乱所造成的混乱。

想象一下这样一种情况:有些宏可以产生向后兼容的呼叫,或者是基于功能可用性的最新呼叫。

#if __has_feature(XYZ)
#   define JX_FOO(_o) new_foo(_o)
#   define JX_BAR(_o) // nop
...
#else
#   define JX_FOO(_o) old_foo(_o)
#   define JX_BAR(_o) old_bar(_o)
...
#endif

一个具体的例子是Objective-C代码的集合,它使用一组宏(https://github.com/JanX2/google-diff-match-patch-Objective-C/blob/master/JXArcCompatibilityMacros.h)从手动内存管理(非ARC)移植到ARC兼容(自动引用计数),以便它后来编译了两种方式。

在某些时候,您希望放弃非ARC支持以提高可读性和可维护性。

编辑:获取预处理器输出的基础如下所述:C, Objective-C preprocessor output

编辑2:如果某人有关于如何实现Xcode中的源到源转换选项的详细信息(编辑>重构>转换为...),这可能会有所帮助。

3 个答案:

答案 0 :(得分:0)

如果您是从头开始编写文件或所有包含文件都在一个地方,为什么不将它们包装在:

#ifndef MACRO_DEBUG
    #include "someLib.h"
    /* ... */
#endif

但正如我所提到的,这仅在包含在连续行中时有效,在最好的情况下,您开始自己从头开始编写文件,这样您就不必去寻找包含。

答案 1 :(得分:0)

这是sed / awk的完美案例。但是,对于您提到的确切用例,存在更好的工具。结帐coan

要预处理源文件,就像定义了符号<SYMBOL>一样,

$ coan source -D<SYMBOL> sourcefile.c

与预处理源文件类似,如果未定义符号<SYMBOL>

$ coan source -U<SYMBOL> source.c

答案 2 :(得分:0)

这是一个愚蠢的解决方案,但它确实有效:显然你可以使用AppCode的重构来删除宏的使用。

但这限制了OS X的解决方案。它也有点繁琐,因为您必须为每个JX_FOO()JX_BAR()手动执行此操作。