【问题标题】:How to check the state of #pragma STDC?如何检查#pragma STDC 的状态?
【发布时间】:2021-12-29 14:49:01
【问题描述】:

考虑这段代码:

/* t0.c */
#pragma STDC FENV_ACCESS ON
#include "t0.h"

那么在t0.h如何查看STDC FENV_ACCESS的状态呢?

/* t0.h */
/* how to check the state of STDC FENV_ACCESS? */
/* something like: #if STDC FENV_ACCESS == ON */

如果不可能,那么:

  1. 为什么不可能?
  2. 将此功能添加到 C 标准中会有用吗?

【问题讨论】:

    标签: c language-lawyer c11 pragma


    【解决方案1】:

    (1) 为什么不可能?

    可能使用自定义 cpp 作为 rryker 的回答。否则,我会说“不”,因为编译器使用了编译指示并且它在cpp pass/stage 之后

    (2) 将此功能添加到 C 标准中会有用吗?

    不,可能不会。由于上述原因。

    而且,因为从已经常见的内容(例如autoconf)中提取叶子,我们可以在不更改现有编译器的情况下扭转问题以获得所需的结果。

    定义(例如)features.h

    #ifdef STDC_FENV_ACCESS_ON
    #if STDC_FENV_ACCESS_ON
    #pragma STDC FENV_ACCESS ON
    #else
    #pragma STDC FENV_ACCESS OFF
    #endif
    #endif
    

    更新:

    Re: "custom cpp as rryker's answer提到":嗯,rryker的答案在哪里?我没看到。 – 下午

    我写道,之前 rryker [部分] 删除了他的答案,因为来自 HolyBlackCat 的批评/cmets 无法立即解决。 我的推断是 rryker 能够改进他的答案并取消删除它,所以我留下了参考。

    rryker 基于他的答案的链接是 clang 提供的特定扩展:https://clang.llvm.org/docs/LanguageExtensions.html rryker 的答案所指的功能是:__has_feature__has_extension 宏 [自版本 10 起]。

    这就是参考。不过,由于我的一些猜测,我会尝试总结一下。

    IIRC,clang 的 cpp 不是一个单独的程序,它只是松散地连接到编译器 [例如。就像gcc] 一样。

    使用clang,预处理器是编译器本身[更]紧密集成的阶段。我的假设是[最初]这样做是为了速度和代码重用。

    但是,作为“副作用”:

    1. clang 的cpp 可以更深入地了解编译器的内部工作原理。

    2. 而且,如果它更有效/更理想,clang 的 cpp 阶段也可以做更多的早期(例如)pragma 处理。

    3. 而且,cpp 可以访问(例如)编译器看到的所有 -f* 参数/选项。

    4. 因此,它具有使上述__has_* 宏上的#if/#ifdef 可行的所有工具。

    【讨论】:

    • Re: "custom cpp as rryker's answer提到":嗯,rryker的答案在哪里?我没看到。
    • @pmor 他删除了他特定于clang的答案,称我的答案更笼统:-)
    【解决方案2】:

    除了其他答案之外,如果 t0.c 实际上在您的控制之下,您可以在使用 #pragma 时定义适当的宏。

    /* t0.c */
    #pragma STDC FENV_ACCESS ON
    #define PRAG_FENV_ACCESS_ON
    #include "t0.h"
    

    这独立于工具链供应商。它是用于检查预处理器中是否存在typedefs 的同一主题的变体。

    【讨论】:

    • Re:“同一主题的变体”:我在哪里可以了解更多信息?
    • @pmor 可能在您的系统标题中。例如。在 FreeBSD 上,typedef mumble rsize_t 旁边有 _RSIZE_T_DEFINED 等宏。
    • 仅供参考:让我想起了this,这可能在某种程度上相关/有用。
    猜你喜欢
    • 2018-01-06
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多