需要帮助理解C代码吗
嗨,我需要一些帮助来理解一些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
#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,而不是解决“编译了预处理器怪物的哪一部分”的难题,但我们需要意识到实验的普遍缺陷。