【问题标题】:How can I define an array in my Objective-C header file?如何在我的 Objective-C 头文件中定义一个数组?
【发布时间】:2026-01-10 09:05:01
【问题描述】:

我的主文件中有这段代码:

int grid[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
               1 , 2 , 3 , 2 , 3 , 2 , 3 , 1 , 
               1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 
               1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 
               1 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 
               1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 
               1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 };

如何在我的标题中定义它,以便我可以在整个班级中访问该变量?

【问题讨论】:

    标签: c objective-c


    【解决方案1】:
    extern int grid[];
    

    假设你有一些这样的代码:

    int grid[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
            1 , 2 , 3 , 2 , 3 , 2 , 3 , 1 , 
            1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 
            1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 
            1 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 
            1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 
            1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 };
    
    int arr_sum(int* arr, int len)
    {
        int sum = 0;
        for (int i = 0; i < len; i++) {
                sum += arr[i];
        }
        return sum;
    }
    
    int main(int argc, char** argv)
    {
        printf("%d\n", arr_sum(grid, sizeof(grid)/sizeof(int) ));
        return 0;
    }
    

    如果你想把它分成两个不同的文件,比如说,你可以有以下内容,例如:

    在grid.c中:

    int grid[] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
            1 , 2 , 3 , 2 , 3 , 2 , 3 , 1 , 
            1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 
            1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 
            1 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 
            1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 
            1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 };
    

    在 main.c 中:

    extern grid[];
    
    int arr_sum(int* arr, int len)
    {
        int sum = 0;
        for (int i = 0; i < len; i++) {
                sum += arr[i];
        }
        return sum;
    }
    
    int main(int argc, char** argv)
    {
        printf("%d\n", arr_sum(grid, sizeof(grid)/sizeof(int) ));
        return 0;
    }
    

    【讨论】:

    • 如何在实现文件中构造数组?
    • 您不需要在其他任何地方构建它。将上面列出的代码放在 main.c 中,并将“extern int grid[]”放在其他使用网格的源文件使用的公共头文件中。或者,如果您不想要标题,只需将 extern 放在使用网格的任何位置。
    • 它可以编译,但是如果我尝试从不同的函数访问数组到定义它的位置,编译器会抛出一个错误:/
    • 你需要一个名为“externals.h”的头文件中的extern——或者类似的东西。它将保存您所有的外部变量声明。在包含 main 的源文件中,不要包含 externals.h 文件,但要包含这些外部变量的实际定义。
    • 网格是否定义在函数的范围内?如果您想在其他功能中使用它,则必须将其移动到更全局的范围内。
    【解决方案2】:

    您不能在标题中定义它。您必须在标头中声明它并在源 (.m) 文件中定义它:

    // In MyClass.h
    extern int grid[];
    
    // In MyClass.m
    int grid[] = {...};
    

    【讨论】:

    • 编译,但是当我在 *.m 文件中的不同函数中时,编译器抱怨它未定义。
    • 您想在 .m 文件的“顶层”定义它(即在所有函数之外)。按照惯例,像这样的全局变量定义在 .m 文件的顶部,就在任何 #import 或 #include 语句的下方。
    • 任何需要使用grid[]的头文件都需要有一个“extern int grid[]”声明,或者需要#include另一个有extern声明的头文件。另见*.com/questions/309801/…
    最近更新 更多