const字符串的常量数组,并且错误“不是编译时常量”

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

我想制作const字符串的模块化枚举矩阵。

我做了两个typedef

globals.h

   #define PAGES_COUNT              8
   #define PARAMETERS_COUNT     8

   typedef const char* const rom_string;
   typedef rom_string const* const rom_string_array;

pages.h

    #include "globals.h"

    typedef enum page_enum{
        PAGE_1_ENUM,
        PAGE_2_ENUM,
    }page_enum;

    extern rom_string pages_names[PAGES_COUNT];
    extern rom_string_array page_list[PAGES_COUNT];

pages.c

#include "globals.h"
#include "pages.h"
#include "page_1.h"
#include "page_2.h"

    rom_string pages_names[PAGES_COUNT] = {
        [PAGE_1_ENUM]   = page_1_name,
        [PAGE_2_ENUM]   = page_2_name,
    };

    rom_string_array page_list[PAGES_COUNT] = {
        [PAGE_1_ENUM]   = page_1,
        [PAGE_2_ENUM]   = page_2,
};

page_1.h

    typedef enum page_1_params{
        PAGE_1_PARAMETER_A,
        PAGE_1_PARAMETER_B,
        PAGE_1_PARAMETER_C,
        PAGE_1_PARAMETER_D,
        PAGE_1_PARAMS_END,
    }page_1_params;

    #define PAGE_1_PARAMS_COUNT (PAGE_1_PARAMS_END)

    extern rom_string       page_1_name;
    extern rom_string_array page_1[PARAMETERS_COUNT];

page_1.c

#include "globals.h"
#include "page_1.h"

    rom_string  page_1_name = "page1.";

    rom_string_array page_1[PARAMETERS_COUNT] = {
        [PAGE_1_PARAMETER_A]    = "text1",
        [PAGE_1_PARAMETER_B]    = "text2",
        [PAGE_1_PARAMETER_C]    = "text3",
        [PAGE_1_PARAMETER_D]    = "text4",
        [PAGE_1_PARAMS_END]     = "",
    };

page_2.h

#include "globals.h"

    typedef enum page_2_params{
        PAGE_2_PARAMETER_A,
        PAGE_2_PARAMETER_B,
        PAGE_2_PARAMETER_C,
        PAGE_2_PARAMETER_D,
        PAGE_2_PARAMS_END,
    }page_2_params;

    #define PAGE_2_PARAMS_COUNT (PAGE_2_PARAMS_END)

    extern rom_string       page_2_name;
    extern rom_string_array page_2[PARAMETERS_COUNT];

page_2.c

#include "globals.h"
#include "page_2.h"

    rom_string  page_2_name = "page2.";

    rom_string_array page_2[PARAMETERS_COUNT] = {
        [PAGE_2_PARAMETER_A]    = "text5",
        [PAGE_2_PARAMETER_B]    = "text6",
        [PAGE_2_PARAMETER_C]    = "text7",
        [PAGE_2_PARAMETER_D]    = "text8",
        [PAGE_2_PARAMS_END]     = "",
    };

问题1:warning我已经在联机C编译器中尝试了“小型”原型,并且没有警告,但是在我的主“ XC8”上,我收到了下一条警告消息,每个数组的每个参数都发出一个警告消息:

incompatible pointer types initializing 'rom_string_array' (aka 'const char *const *const') with an expression of type 'rom_string_array [8]' [-Wincompatible-pointer-types]

[8]这里来自array size宏。不同的数组会有所不同。

问题2:error

error: initializer element is not a compile-time constant

此元素发生此错误:

[PAGE_1_ENUM]   = page_1_name,

pages_names个数组。如果我删除此元素,则下一个错误会发生。与page_list ive有相同的情况。这对我来说并不明智,我认为这是一个链接器工作。所以我必须做的是,将所有文件都包含在一个文件中?我可以解决这个问题吗?

根据要求重新加工。

c string pointers const
1个回答
1
投票

当用rom_string_array声明这样的变量时:

rom_string_array my_array[SIZE];

与以下相同:

rom_string const* const my_array[SIZE];

与以下相同:

const char* const const* const my_array[SIZE];

所以您声明的内容(暂时忽略const量词)不是char *的数组,而是char **的数组。您应该完全取消rom_string_array并像这样创建数组:

rom_string my_array[SIZE];

关于“初始化程序元素不是编译时常数”错误,如错误消息所述,只能使用编译时常数来初始化在文件范围内定义的变量。其中包括数字常量,字符串常量和涉及这些常量的简单表达式,以及扩展到其中之一的预处理器宏。它确实not包括其他变量,即使它们已声明为const

因此,您需要将ui_page_service_name更改为宏,以使其可用作初始化程序,即:

#define ui_page_service_name "123"
© www.soinside.com 2019 - 2024. All rights reserved.