内核模块中初始化程序周围缺少大括号

问题描述 投票:0回答:1

我正在尝试为内核驱动程序中的用例编写以下驱动程序。为了简单起见,我在这里硬编码了几个值,并减少了 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] = {
      |         ^~~~~~

我尝试了几次右大括号,但这个警告并没有消失。

  1. 在内核模块中写入结构体数组是否合法,
  2. 如何纠正上述驱动程序?
c linux-device-driver kernel-module
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.