是否可以 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 类型的全局变量,然后使用一些内联汇编来equal
ate Buffer1
和 Buffer2
到 Buffer1 和 2
。 equ
应该在符号表中创建具有相同值(地址)的新符号。
请注意,这不适用于放置在 .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;
}
请注意,如果您无法修改引用 buffer1
和 buffer2
的代码,这应该是最后的手段。如果您可以修改代码,那么您应该只是 extern 一个 union 体,并让代码引用 union 体的其中一个成员,如@Dmitri 的回答中所述。
关于c - C中不同文件的 union 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33655187/