【问题标题】:Need help in understand C code在理解 C 代码方面需要帮助
【发布时间】:2013-06-04 13:13:17
【问题描述】:

您好,我需要一些帮助来理解一些 C 代码:

#if 0
   some C code 1
#elif 0
   static int8 arry[10];
#pragma Align_to(32, arry)
   ASSERT(((int8ptr_t)arry) & 15) == 0)
#else
   ASSERT(((int8ptr_t)arry) & 15) == 0)
#endif

我的问题:

  1. 是否只有#else部分编译?

  2. #pragma Align_to(32, arry)在#elif 0的情况下是什么意思?

【问题讨论】:

  • 它是pragma 而不是pramga。
  • 无论是 pragma 还是 pramga 都不相关……#elif 0 表示它被忽略了。只有 #else 被编译为 OP 推测。
  • @KScottPiel 这是必需的吗?我知道编译器可以处理所有#pragmas,无论它们是否在#if

标签: c c-preprocessor conditional-compilation


【解决方案1】:

实际上更好的回答方法是询问编译器 - 使用 g++ -E 或 MSVC: cl /EP 打印真正编译的内容

【讨论】:

  • 通过实验编程?我不相信询问编译器会给出任何明确的答案——不像阅读 C 语言规范/标准那样。
  • @Jens 我的回答与问题的第一部分有关 - 而不是解决难题“编译了预处理器怪物的哪一部分” 我更愿意生成扩展文件
  • +1 很公平,但我们需要注意一般的实验陷阱。
【解决方案2】:

是的,#else 部分是编译的。


#pragma 指令是编译器特定的指令。由于没有指定您的编译器,它可能意味着任何东西。

在您的情况#pragma Align_to(32, arry) 中,可能会告诉编译器确保变量“arry”位于内存中的 32 字节边界上。这通常是出于性能原因或兼容性问题。您可能还想查看关键字__attribute__ 用于控制类似的变量属性。

【讨论】:

    【解决方案3】:

    回答 1:是的,但请注意,即使 #if 0 等中的部分也必须包含有效的预处理令牌。这意味着这将因诊断而失败:

    #if 0
    That's what C is all about
    #endif
    

    因为单独的' 引入了一个未终止的字符常量。未终止的字符串文字也是如此。

    答案 2:pragma 是对编译器的提示,arry 的地址应按 32 的倍数对齐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多