需要帮助理解C代码吗

需要帮助理解C代码吗,c,c-preprocessor,conditional-compilation,C,C Preprocessor,Conditional Compilation,嗨,我需要一些帮助来理解一些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 我的问题是: 是否只编译了#else部分 在#elif 0情况下,#pragma Align

嗨,我需要一些帮助来理解一些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
我的问题是:

  • 是否只编译了
    #else
    部分

  • #elif 0
    情况下,
    #pragma Align#u to(32,arry)
    的含义是什么


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

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

    #if 0
    That's what C is all about
    #endif
    
    因为孤独的
    引入了一个未终止的字符常量。未终止的字符串文本也是如此

    对2的回答:
    pragma
    提示编译器
    arry
    的地址应以32的倍数对齐。

    是的,
    \else
    部分就是编译的部分


    #pragma
    指令是编译器特定的指令。因为没有指定编译器,所以它可能意味着任何东西


    在您的例子中,
    #pragma Align_to(32,arry)
    ,可能会告诉编译器确保变量'arry'位于内存中32字节的边界上。这通常是出于性能原因或兼容性考虑。您可能还需要查看用于控制类似变量属性的关键字
    \uuuu属性。

    我相信它是
    \pragma
    。它是
    pragma
    而不是
    praga
    。它是pragma还是praga都不相关。。。
    #elif 0
    表示忽略它。只有
    #else
    被编译为OP推测的值。@KScottPiel这是必需的吗?我知道编译器可以处理所有的杂注,而不管它们是否处于实验性编程状态?我不相信询问编译器会给出任何明确的答案——这与阅读C语言规范/标准不同。@Jens我的答案与问题的第一部分有关——我宁愿生成扩展文件+1,而不是解决“编译了预处理器怪物的哪一部分”的难题,但我们需要意识到实验的普遍缺陷。