【发布时间】:2011-09-13 15:11:44
【问题描述】:
我正在做一些低级编程。为了我的任务,我需要初始化(有时是硬件限制的)数组。它可以只是 char[],也可以是 unsigned short 或其他。
最易读的方法是只使用一些已知长度的常量字符串。为了简化任务,我编写了一个宏来帮助自己。
#define INI( x ) { (x[0] << 8) | 0x00, (x[1] << 8) | 0x00 }
static const unsigned int tab[] = INI("ab");
int main(){
return 0;
}
当然,上面的宏位于某个#ifdef 块内,并且取决于构建它的架构。我遇到的问题是我收到错误:
initializer element is not constant
main.c:3: error: (near initialization for "tab[0]")
initializer element is not constant
main.c:3: error: (near initialization for "tab[1]")
但上面的代码扩展为:
static const unsigned int tab[] = { ("ab"[0] << 8) | 0x00, ("ab"[1] << 8) | 0x00 };
int main(){
return 0;
}
每个元素不仅在编译时是常量,而且在预处理器时也是常量。甚至可以创建宏,从字符串中获取每个字符并进行一些操作(如果只有预处理器能够获取字符串的长度并且当然会有一些循环选项)。
那么 - 为什么编译器无法提取这些信息,我的选择是什么?真诚感谢任何帮助。
PS。我知道它在 main() 中作为
const unsigned int tab[] = INI("ab");
但我在任何函数之外都需要它。
【问题讨论】:
-
我可以使用 DevStudio 2010 来编译它。编辑:实际上,这就是 C++ 编译器的工作原理。
-
@Throwback1986 - 当然是 C99。很抱歉没有指定它。我只是假设会考虑这个版本。
-
在
| 0x00中与 0 进行 oring 有什么意义? -
@Jens - 嘿好地方 :),它只是带有第二个参数的更复杂宏的剩余部分 - 即有时它不是 0x0。 OTOH,我发现它也更具可读性 - 它提醒了包中还有另一个字节。
标签: c arrays string static initialization