4

如何使用 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

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

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

编辑:这里描述了获取预处理器输出的基础:C,Objective-C 预处理器输出

编辑 2:如果有人详细了解 Xcode 中的源到源转换选项是如何实现的(编辑 > 重构 > 转换为...),那可能会有所帮助。

4

3 回答 3

0

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

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

$ coan source -D<SYMBOL> sourcefile.c

与预处理源文件类似,就好像<SYMBOL>未定义符号一样,

$ coan source -U<SYMBOL> source.c
于 2013-08-06T10:25:16.670 回答
0

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

不过,这将解决方案限制在 OS X 上。这也有点乏味,因为您必须为每个JX_FOO()and手动执行此操作JX_BAR()

于 2014-03-06T10:38:46.890 回答
0

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

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

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

于 2013-08-06T10:05:52.123 回答