gpt4 book ai didi

c - 从常量字符串初始化静态数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:04 26 4
gpt4 key购买 nike

我正在做一些底层编程。为了完成我的任务,我需要初始化(有时是硬件限制的)数组。它可以只是 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 block 内,并且取决于它所构建的架构。我遇到的问题是出现错误:

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;
}

每个元素不仅在编译时是常量,而且在预处理器时也是。甚至可以创建从字符串中获取每个字符并进行一些操作的宏(如果只有预处理器能够获取字符串的长度并且当然会有一些循环选项)。

那么 - 为什么编译器无法提取此信息,我有哪些选择?真诚感谢任何帮助。

附言。我知道它在 main() 中作为

const unsigned int tab[] = INI("ab");

但我在任何函数之外都需要它。

最佳答案

您不能在预处理器中进行字符串下标/索引。您可以做的是稍微更改一下宏:

#define ROW( x, y ) { ((x) << 8) | 0x00, ((y) << 8) | 0x00 }

static const unsigned int tab[] = ROW('a' , 'b');

关于c - 从常量字符串初始化静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7404215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com