我正在尝试为内核驱动程序中的用例编写以下驱动程序。为了简单起见,我在这里硬编码了几个值,并减少了 1 个元素的数组,驱动程序代码如下,
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#define MODULE_NAME ("test-module")
#define BOARD_VER 3
#define BOARD_SAM 2
struct foo {
int variant;
char *str[3];
};
struct bar {
int sample;
struct foo fooarr[3];
};
static int __init dtcprop_init(void)
{
unsigned int board_sample, board_variant;
int i = 0;
board_sample = BOARD_SAM;
board_variant= BOARD_VER;
struct bar bar_array[6] = {
-1,
{ 0, NULL,NULL,NULL },
};
if (bar_array[board_sample].sample != -1 && bar_array[board_sample].fooarr[board_variant].variant != -1) {
while (bar_array[board_sample].fooarr[board_variant].str[i] != NULL) {
pr_info("%s: %s\n", MODULE_NAME, bar_array[board_sample].fooarr[board_variant].str[i++]);
}
} else {
pr_info("%s: unsupported board\n", MODULE_NAME);
}
return 0;
}
arch_initcall(dtcprop_init);
但是我收到这些被视为错误的警告,
41:35: warning: missing braces around initializer [-Wmissing-braces]
41:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
41 | struct bar bar_array[6] = {
| ^~~~~~
我尝试了几次右大括号,但这个警告并没有消失。
C90 不允许在任何地方进行声明,除了周围函数体的顶部(紧接在
{
之后)。所以 C90 中的修复是这样的:
static int __init dtcprop_init(void)
{
unsigned int board_sample, board_variant;
int i = 0;
struct bar bar_array[6] = {
-1,
{ 0, NULL,NULL,NULL },
};
board_sample = BOARD_SAM;
board_variant= BOARD_VER;
但是,最好解决问题的根源,即您使用的是 34 年历史的编译器。这与在 34 年旧计算机上运行 Linux 一样明智:) 因此,请删除任何选项
-std=gnu89
/-std=c89
/-std=gnu90
/-std=c90
/-ansi
。这些都不应该被使用。同时更新到 gcc 版本 5.0.0 或更高版本,它不默认为 C90。