C 如何在函数外使用for循环创建多个全局变量?

C 如何在函数外使用for循环创建多个全局变量?,c,C,我有一个列表,我想为列表中的每个项目创建一个全局计数器,初始值设置为1。我原以为我会使用for循环来实现这一点(我的实际列表比下面的示例大得多),但我刚刚意识到for循环在函数之外不起作用。我怎样才能让下面的代码工作 char* list[] = {"A", "B", "C"}; for (int i = 0; i < sizeof(list); i++){ int counter[i] = 1; } } char*list[]={“A”、“B”、“C”}; 对于(in

我有一个列表,我想为列表中的每个项目创建一个全局计数器,初始值设置为
1
。我原以为我会使用
for
循环来实现这一点(我的实际列表比下面的示例大得多),但我刚刚意识到
for
循环在函数之外不起作用。我怎样才能让下面的代码工作

char* list[] = {"A", "B", "C"};

for (int i = 0; i < sizeof(list); i++){
    int counter[i] = 1;
    }
}
char*list[]={“A”、“B”、“C”};
对于(int i=0;i
C没有在函数之外运行此类初始化代码的工具。由于文件范围内静态变量的初始值设定项必须是常量表达式,因此有两个选项:

  • 使用您选择的脚本语言创建一个脚本,该脚本生成一个大小合适的初始值设定项宏,供您用作数组的初始值设定项。例如,脚本可以读取此文件:

    #include "my_init_list.h"
    char* list[] = {"A", "B", "C", /* However many more */};
    int counter[] = COUNTERS_INITIALIZER;
    
    它将解析
    列表的初始值设定项
    ,并输出文件
    my_init_list.h
    ,该文件将包含扩展为
    {1,1,…,1}
    的宏
    计数器。如果将脚本作为构建过程中的一个步骤来运行,那么就应该这样做

  • 将初始化代码放入函数中,并在程序启动代码的早期将函数装配为运行一次(当它开始运行时,
    main
    执行的内容)


  • C没有在函数之外运行此类初始化代码的工具。由于文件范围内静态变量的初始值设定项必须是常量表达式,因此有两个选项:

  • 使用您选择的脚本语言创建一个脚本,该脚本生成一个大小合适的初始值设定项宏,供您用作数组的初始值设定项。例如,脚本可以读取此文件:

    #include "my_init_list.h"
    char* list[] = {"A", "B", "C", /* However many more */};
    int counter[] = COUNTERS_INITIALIZER;
    
    它将解析
    列表的初始值设定项
    ,并输出文件
    my_init_list.h
    ,该文件将包含扩展为
    {1,1,…,1}
    的宏
    计数器。如果将脚本作为构建过程中的一个步骤来运行,那么就应该这样做

  • 将初始化代码放入函数中,并在程序启动代码的早期将函数装配为运行一次(当它开始运行时,
    main
    执行的内容)


  • 这就是你想要的吗

    char* list[] = {"A", "B", "C"};
    int counter[] = {1, 1, 1};
    
    只需全局声明它们并初始化
    计数器
    ,就像初始化
    列表一样

    还可以全局声明
    计数器
    ,然后在
    main()
    或任何带有
    for
    循环的地方初始化它:

    char* list[] = {"A", "B", "C"};
    int counter[3];
    
    int main(void) {
        for (int i = 0; i < sizeof(list) / sizeof(*list); i++) {
            counter[i] = 1;
        }
    }
    

    请注意,您不能简单地使用
    sizeof(list)
    …这将返回
    list
    已分配的内存量。您需要将
    sizeof(list)
    除以每个元素的大小,
    sizeof(*list)
    ,以获得元素的数量

    这就是您想要的吗

    char* list[] = {"A", "B", "C"};
    int counter[] = {1, 1, 1};
    
    只需全局声明它们并初始化
    计数器
    ,就像初始化
    列表一样

    还可以全局声明
    计数器
    ,然后在
    main()
    或任何带有
    for
    循环的地方初始化它:

    char* list[] = {"A", "B", "C"};
    int counter[3];
    
    int main(void) {
        for (int i = 0; i < sizeof(list) / sizeof(*list); i++) {
            counter[i] = 1;
        }
    }
    

    请注意,您不能简单地使用
    sizeof(list)
    …这将返回
    list
    已分配的内存量。您需要将
    sizeof(list)
    除以每个元素的大小,
    sizeof(*list)
    ,以获得初始化为0的元素数。您所需要做的就是声明变量。列表在函数中?对不起,我使用了0作为一个不好的示例。我已将其更改为1。然后需要将循环放入函数中,例如在
    main
    的顶部,或在
    main
    顶部调用的单独函数中。声明仍然可以在外部执行:
    int counter[sizeof(list)/sizeof(list[0])请举例说明您打算如何使用计数器。您将要实现许多代码段,每个代码段对其中一个计数器的使用方式不同<代码>计数器[A]+
    <代码>计数器B++
    <代码>计数器['A']+
    <代码>C++
    <代码>x='D';计数器[x]+
    ?全局变量初始化为0。您所需要做的就是声明变量。列表在函数中?对不起,我使用了0作为一个不好的示例。我已将其更改为1。然后需要将循环放入函数中,例如在
    main
    的顶部,或在
    main
    顶部调用的单独函数中。声明仍然可以在外部执行:
    int counter[sizeof(list)/sizeof(list[0])请举例说明您打算如何使用计数器。您将要实现许多代码段,每个代码段对其中一个计数器的使用方式不同<代码>计数器[A]+
    <代码>计数器B++<代码>计数器['A']+<代码>C++<代码>x='D';计数器[x]+?
    sizeof(list)/sizeof(*list)
    是一个常量表达式,可以用作
    计数器的大小
    as
    int计数器[sizeof(list)/sizeof(*list)]
    sizeof(list)/sizeof(*list)
    是一个常量表达式,可用作
    计数器的大小
    as
    int计数器[sizeof(list)/sizeof(*list)]