我在C中创建一个将使用文本菜单的应用程序.所以,我决定创建一个包含所有菜单的全局数组.作为稍后我将提到的问题的解决方法,代码如下所示:
char* main_menu[]=
{"Refresh rate", "Help", "Default config", NULL};
char* other_stuff[]=
{"Stuff", "More", NULL};
char** screens[]={main_menu, other_stuff};
Run Code Online (Sandbox Code Playgroud)
我可以使用这些字符串:screens[0][1]在第0个/第一个菜单中首先表示(或者说第二个,因为我们从零开始计算)选项.
它有效,但它让我觉得非常不优雅,我必须声明那些辅助阵列(main_menu和other_stuff).我试图利用数组的嵌套大括号初始化,但总是编译器会抱怨.此外,在你建议将阵列声明为,比如说之前,char* screeens[10][5]应该没有神奇的数字,因为这对我来说同样不优雅.
我试过了:
char** screens[]={
{"Refresh rate", "Help", "Default config", NULL},
{"Stuff", "More", NULL}
};
Run Code Online (Sandbox Code Playgroud)
但是,编译器给了我一个警告(理所当然,因为访问元素会产生乱码):
../main.c:96:1: warning: braces around scalar initializer [enabled by default]
{"Refresh rate", "Help", "Default config", NULL},
^
../main.c:96:1: warning: (near initialization for ‘screens[0]’) [enabled by default]
../main.c:96:1: warning: initialization from incompatible pointer type [enabled by default]
../main.c:96:1: warning: (near initialization for ‘screens[0]’) [enabled by default]
../main.c:96:1: warning: excess elements in scalar initializer [enabled by default]
Run Code Online (Sandbox Code Playgroud)
等等.
如果我将第一行更改为char* screens[][]={,编译器将根本不编译代码,给出错误:error: array type has incomplete element type.
我正在编写嵌入式环境(avr-gcc 4.8.1),其中内存非常稀缺,所以我不想声明大于必要的数组,从而浪费内存.有什么我可以做的,或者这是否尽可能简单?
假设你有C99或更高版本,你可以使用'复合文字'来初始化你的数组:
#include <stddef.h> // NULL
char **screens2[] =
{
(char *[]){ "Refresh rate", "Help", "Default config", NULL },
(char *[]){ "Stuff", "More", NULL },
};
Run Code Online (Sandbox Code Playgroud)
或者,如果你想成为 - const正确(一件好事 - 感谢MM和他的评论):
char const * const * screens3[] =
{
(char const * const []){ "Refresh rate", "Help", "Default config", NULL },
(char const * const []){ "Stuff", "More", NULL },
};
Run Code Online (Sandbox Code Playgroud)
编译(清理 - 没有警告或错误):
gcc -std=c11 -O3 -g -Wall -Wextra -Werror -pedantic -c 2das.c
Run Code Online (Sandbox Code Playgroud)
(Mac OS X 10.10.5上的GCC 5.1.0)
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |