gpt4 book ai didi

c - C中不同文件的 union 变量

转载 作者:太空宇宙 更新时间:2023-11-04 01:56:30 33 4
gpt4 key购买 nike

是否可以 union 另一个文件中声明为 extern 的变量?这适用于需要保留内存的嵌入式应用程序,因此尽可能共享。即:

文件1.h:

extern char Buffer1[ 10 ];

文件2.h

extern char Buffer2[ 15 ];

??????

typedef union
{
Buffer1;
Buffer2;
} uBuffers;

我意识到没有类型这不是正确的语法,但如果使用了类型则声明了一个新变量。它们可以显式放置在 RAM 中,但这会降低灵 active 。

编辑:感谢您的回答。我应该说清楚的是出现这种情况的原因。我不得不包括一些优化的汇编器,它使用我希望 union 在一起的变量。然而,汇编器语法不允许 union ,即 EXTERN uBuffers.Buffer1 - 会产生语法错误。

最佳答案

extern 声明只是告诉编译器这些变量存在于某处,以及它们的类型是什么。当您引用这些符号时,编译器会在代码中留下一个漏洞,链接器可以在知道实际地址后插入这些漏洞。您需要安排链接器为两个符号分配相同的地址。您可以声明一个名为 Buffer1and2 的 union 类型的全局变量,然后使用一些内联汇编来equalate Buffer1Buffer2Buffer1 和 2equ 应该在符号表中创建具有相同值(地址)的新符号。

请注意,这不适用于放置在 .comm 部分中的非静态或未初始化数据。这是一个非常丑陋的 hack,但它确实会导致两个单独的全局变量出现在同一个地址,而它们似乎不是 union 成员......

dut.h

typedef char Buffer1[25];
typedef char Buffer2[30];

extern Buffer1 buffer1;
extern Buffer2 buffer2;

dut.c

#include "dut.h"

static union {
Buffer1 buffer1;
Buffer2 buffer2;
} bufferX;

__asm(".globl buffer1\n"
".equ buffer1, bufferX\n"
".globl buffer2\n"
".equ buffer2, bufferX\n");

主.c

#include <stdio.h>
#include "dut.h"

int main(int argc, char **argv)
{
buffer1[0] = 0xa5;
printf("%02x\n", buffer2[0]);
return 0;
}

请注意,如果您无法修改引用 buffer1buffer2 的代码,这应该是最后的手段。如果您可以修改代码,那么您应该只是 extern 一个 union 体,并让代码引用 union 体的其中一个成员,如@Dmitri 的回答中所述。

关于c - C中不同文件的 union 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33655187/

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