【问题标题】:Static array - where should I define it?静态数组 - 我应该在哪里定义它?
【发布时间】:2019-09-19 17:10:43
【问题描述】:

我已经定义了以下静态常量数组:

const int arr[197] = { 55, -63, 12, -17, 121 , ... };

数组永远不会改变。它包含一些符合我的程序的特定数字模式。 该数组用于三个不同的文件:

  • foo1()file1.c
  • foo2()file2.c
  • foo3()file3.c

每次将数组作为参数传递给函数。

因为这个数组的定义很长而且很广泛,我想创建一个单独的文件来定义和保存这个数组。

应该如何正确完成?我应该在假设arr.h 中定义该数组,然后将#include <arr.h> 放入使用该数组的.c 文件中吗?

【问题讨论】:

  • 我可以看到您的问题不是关于数组本身,而是关于全局变量和它们的可访问性。您可以创建一个单例类并共享它,也可以将其设为静态并共享它。有很多方法可以做到这一点。
  • .h中声明为extern并在.c中定义
  • @IłyaBursov 那么在arr.c 中定义,在arr.h 中声明为extern,然后在.c 文件中声明为#include <arr.h> 将使用该数组? :)
  • @weno 是的,这就是它在 c 中的工作方式
  • “每次将数组作为参数传递给函数” 是的,这是正确的做法。请注意,将数组作为参数传递实际上只传递了指向数组中第一个对象的指针。所以对性能的影响很小。

标签: c file include


【解决方案1】:

定义 const int arr[197] = ... in arr.c

声明 extern const int arr[197]; in arr.h

只在arr.c, file1.c, file2.c, file3.c 中包含arr.h#include "arr.h",而不是#include <arr.h> 几乎就像@weno 一样

【讨论】:

  • 谢谢。您是否有任何想法使这个数组不是全局的?在foo1()foo2()foo3() 中定义它三次或在main() 中定义它似乎都不好,因为这个数组定义的代码真的很长,并且使所有内容都无法阅读。这就是为什么在第一次播放中为数组单独文件。但是有什么办法不让它全球化?
  • @weno:“全局”在 C 中不是一个专有术语。数组的名称(标识符)不需要在文件范围内可见,而不是在定义它的文件中;它只能在使用它的函数内部声明。但它必须具有外部链接,以便声明引用与定义相同的对象。
  • weno 这个答案不是“在 foo1(), foo2(), foo3() 中定义了 3 次”,而是在 arr.c 中定义了一次。
【解决方案2】:

我无法评论接受的答案(newb),所以这里有一些方法可以定义一次数组,但不能作为全局变量:

  1. 丑陋的:在arr.h 中定义数组,然后在foo1/2/3() 中,只是#include "arr.h"(在函数体内部)。
// arr.h
const int arr[197] = { 55, -63, 12, -17, 121 , ... };

// file1.c
void foo1()
{
#include "arr.h"
    // Use arr like a local variable
}
  1. 不那么丑但仍然很丑:在arr.h 中定义arr,但只包含在main 中。然后,将 arr 作为参数传递给 foo1/2/3
int main()
{
#include "arr.h"
    foo1(arr);
    foo2(arr);
    foo3(arr);
}
  1. 教科书:
// arr_init.c
void init_arr(int arr[197])
{
    const int src_arr[197] = {55, -63, 12, -17, 121 , ...};
    memcpy(arr, src_arr, sizeof(src_arr));
}

// arr_init.h
extern void init_arr(int arr[197]);

// main.c
#include "init_arr.h"
int main()
{
    int arr[197];
    init_arr(arr);
    foo1(arr);
    foo2(arr);
    foo3(arr);
}

// file1.c
void foo1(const int arr[197])
{
...
}

...
  1. 最佳:使用全局常量作为@chux said

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2020-09-13
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多