【问题标题】:How do I limit the scope of the preprocessing definitions used?如何限制使用的预处理定义的范围?
【发布时间】:2013-08-06 10:00:54
【问题描述】:

如何使用 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-diff-match-patch-Objective-C/blob/master/JXArcCompatibilityMacros.h) 从手动内存管理(非 ARC)移植为与 ARC 兼容(自动引用计数)的 Objective-C 代码集合,以便编译之后的两种方式。

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

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

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

【问题讨论】:

    标签: objective-c c gcc macros clang


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我要为我的宏执行此操作,结果将与我想要的相反。如果我对所有非宏文件包含,源代码将变得混乱,结果仍然包含所有隐式包含的标题(即使我暂时走这条路)。
    • 据我所知,没有其他纯 C 方法。也许制作一个只包含其他文件的文件,将所有包含放在那里,然后将其包含在#ifndef ... #endif 中(或者在需要时注释掉该文件的包含)。
    • 我实际上并不需要一种使用 C 的方法。我需要的是一种以某种方式(错误)使用 C 预处理器的方法。
    【解决方案2】:

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

    要对源文件进行预处理,就像定义了符号 <SYMBOL>

    $ coan source -D<SYMBOL> sourcefile.c
    

    类似地预处理源文件,就好像符号&lt;SYMBOL&gt;没有定义一样,

    $ coan source -U<SYMBOL> source.c
    

    【讨论】:

    • coan 看起来和我想的一模一样!我会检查并报告回来。 :)
    • 我尝试在 OS X 上构建 coan,但遇到了问题。一旦这些都被清除了,我会试一试。
    • @JanX2 我是 coan 的维护者。我不为 OS X 维护它,但有 OS X 用户。其中一位最近告诉我,要为 OS X 10.8 构建 v5.1.2,他必须:“将 AM_CXXFLAGS 更改为 -std=c++11 -stdlib=libc++;将 CPP11_HAVE_MATURE_UNIQUE_PTR 设置为 0。”
    • 太棒了!我会试试的。我向您发送了一封包含详细信息的电子邮件(发送至 clan@...)。显然,你没有得到它!
    • @JanX2 不,我没有这样的电子邮件地址。 coan@的错字...?您可以使用我的 SO 电子邮件。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      相关资源
      最近更新 更多