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

标签 c embedded unions

是否可以 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/

相关文章:

sql - MySQL:在多个表上进行多列连接

c - 为什么我从代码中带有位域的 C union 获得此输出?

c - 用作指针的队列

c++ - 在 C++ 中包装 C,仅用于 try/catch

c++ - OpenGL ES 2.0 在 C++ 中共享 esContext

html - 嵌入式网络/应用服务器

C 联盟产出不明

c - 代码 "should"有效,但程序停止工作

两行不同的c语法?

c - #include .c 源文件是否可以用于嵌入式 C 代码的可维护性?