gpt4 book ai didi

c - 如何将数组数据包设为私有(private)并在 C 中访问它们

转载 作者:行者123 更新时间:2023-11-30 15:25:48 25 4
gpt4 key购买 nike

我想知道如何通过将数组“data_pack[]”声明为私有(private)数组来使我的代码更好。我在嵌入式领域工作,所以我的 RAM 和内存有限,我想做的只有两件事。

1.I have a serial UI which gives me serial data of 50 Bytes and stores them directly to unsigned char data_pack[50]

2.And I wanted to access the array in another module to calculate and do other things.

目前,我将数组保留为全局变量,并且可以从项目中的任何模块进行访问。如果我想将 data_pack[50] 保留为私有(private),我如何访问其他模块中的数组数据包?

I hope i will be more clearer after explaining here:
I have four modules.
main.c
ui.c
display.c
display2.c

如果我想在 ui.c 中将 data_pack[50] 保留为 pvt 并在其他模块中访问它..我怎样才能在不使其全局化的情况下做到这一点。

For eg: In ui.c I would like the data_pack[] to get filled in and in display.c and display2.c I want to access the array and read its element.In that case how could i pass the array in to other source files

将 data_pack[] 保持为私有(private)来访问 data_pack[] 的最佳方式是什么?或者我应该使用结构来代替?

最佳答案

您可以通过将全局变量 data_pack 的前向引用更改为 extern const ... 使其在其他编译单元中变为只读。例如两个文件:

file1.c

char example[50] = {1, 2, 3};

void change() {
example[1] = 44;
}

file2.c

#include <stdio.h>

/* extern const char example[50]; array size not needed in extern declaration */
extern const char example[];
void change();

int main() {
printf("%d\n", example[1]); /* works */
change();
printf("%d\n", example[1]);
/* example[0] = 45; would cause a compile error */
return 0;
}

因此,file2.c 会将 example 视为常量整数数组,这意味着它只能由 file1.c 修改。上面的代码将打印 2,然后打印 44。

但是,您必须小心执行此操作。如果前向声明中数组的大小与其所在编译单元中数组的实际大小不同,编译器/链接器将不会告诉您(至少它不会告诉您)我,使用 gcc -Wall -Wextra -ansi -pedantic)。 您还可以将数组大小保留在 extern 声明之外。

需要注意的一件事是,编译器可能会尝试优化 const 值,因为它可能不希望该值发生更改,从而产生无效的优化。我已经执行了一些测试,GCC 似乎没有这样做,但由于它是未定义的行为,您可能希望改用 getter/setter 解决方案。

关于c - 如何将数组数据包设为私有(private)并在 C 中访问它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27687759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com