如何使用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中的源到源转换选项的详细信息(编辑>重构>转换为...),这可能会有所帮助。
答案 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()
手动执行此操作。