【问题标题】:How differently are Compiler directives and preprocessor directives handled by compiler编译器处理的编译器指令和预处理器指令有何不同
【发布时间】:2011-06-14 18:46:32
【问题描述】:

在 C 语言中,我想知道编译器指令和预处理器指令在 GCC 等编译器的处理/实现方面有何不同?谢谢!

通过编译器指令,它们如下所示:

OpenMP(开放式多处理)是一种 应用程序接口 (API) 支持多平台 共享内存多处理 使用 C、C++ 和 Fortran 进行编程 许多体系结构,包括 Unix 和 微软视窗平台。它 由一组编译器指令、库例程和 影响的环境变量 运行时行为。

【问题讨论】:

  • 预处理器实际上是由 C 标准标准化的,所以你应该通过阅读它来很好地了解它的作用。至于“编译器指令”,请解释您的意思并查阅编译器的文档。 [编辑后:]这是关于 C 还是关于 OpenMP 的问题?
  • @delnan:举个例子吧。
  • @Kerrek:举个例子吧。
  • 这是this question 的副本吗?你的意思是问#pragmas?
  • @Kerrek:不。这是针对 OpenMP 的,而这是通用的。我猜#pragma 只是编译器指令的一个例子?还有其他编译器指令吗?

标签: c gcc


【解决方案1】:

编译器按照 in C99 6.10 节的规定处理预处理器指令。

【讨论】:

    【解决方案2】:

    编译器不处理预处理器指令;预处理器会这样做。预处理器完成后,会将其输出提供给编译器,编译器可以根据需要解释编译器指令(如#pragmas)。

    【讨论】:

    • 谢谢! GCC 如何处理编译器指令?
    • the documentation。你可能对-fopenmp感兴趣。
    • @Tim -- gcc 是开源的。因此,与其问三遍 gcc 是如何做某事的,不如找到 gcc 并阅读源代码?如需快速概览,请参阅 man gcc。 RFTM,伙计。无论如何,问题在很大程度上毫无意义,而且肯定过于宽泛。获得生命。
    【解决方案3】:

    至于预处理器,请参阅 Pete Wilson 的回答。至于#pragma 指令,Wikipedia 有这样的说法:

    #pragma 指令是编译器特定的指令,编译器供应商可以将其用于自己的目的。

    【讨论】:

    • GCC 如何实现编译器指令?一些一般的想法会很好。
    • “实施”是什么意思?正如它所说,编译指示是编译器特定于供应商的指令,它们可以做各种各样的事情。它们没有什么“一般性”,它们可能什么都不做,或者擦除你的硬盘或让你喝咖啡……例如,GCC(和 MSVC?)中的“pack”编译指示控制聚合 structs 在内存中的对齐方式,所以这是在编译器生成的程序集中“实现”的。其他编译指示禁用警告,例如我见过几次是在 C++ 构造函数中使用*this。当你说*this时,编译器不会抱怨它是“实现”的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多