我正在做一些低级编程。出于我的任务的目的,我需要初始化(有时是硬件限制的)数组。它可以只是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");
但我在任何功能之外都需要它。
答案 0 :(得分:1)
您不能在预处理器中执行字符串下标/索引。你可以做的是稍微改变一下宏:
#define ROW( x, y ) { ((x) << 8) | 0x00, ((y) << 8) | 0x00 }
static const unsigned int tab[] = ROW('a' , 'b');
答案 1 :(得分:0)
假设它是C99,标准说:
此复合文字中的表达式必须是常量。
参考具有文件范围的指针的示例。使用常量变量的表达式是不够的 - 结果表达式也必须是常量。