如何初始化指向外部变量的全局指针?

How to initialize global pointer to extern variable?

假设我有以下结构:

typedef struct
{
  uint8_t *ptr;
} Example;

如果我在 file1.c:

// Global variable
uint8_t myVar;

如何在 file2.c 中用指向 myVarptr 成员初始化 Example

我知道我可以做到:

extern uint8_t myVar;
// Global variable
Example myExample = {.ptr = &myVar};

但是 myVar 在 file2.c 的所有范围内都是可见的,我正在努力避免这种情况。

您需要在 file.c

中添加函数
static uint8_t myVar;

uint_8 *getMyVat(void)
{
    return &myvar;
}

在file2.c

void foo(void)
{
     Example myExample = {.ptr = getMyVar()};
}

但不能作为静态存储变量的初始化

恐怕你不能。 C语言只有3个作用域:

  • 全局作用域(可能)对整个程序可见(跨不同的编译单元)
  • 静态范围对编译单元可见
  • 局部作用域对声明变量的块可见

如果要初始化全局或静态变量,其初始化器只能包含全局或静态符号,这些符号必须在整个源文件中可见。

指针或其他对象可以在源文件中可用,而无需在其初始值设定项中使用的符号可见,方法是在一个源文件(或多个)中声明它extern并在单独的源文件中定义它文件。

创建一个单独的 C 文件,例如 myExample.c,包含 myExample:

的定义
#include "myExample.h"

extern uint8_t myVar;
Example myExample = { .ptr = &myVar };

创建一个头文件,例如 myExample.h,声明 myExample:

typedef struct
{
  uint8_t *ptr;
} Example;

extern Example myExample;

然后在您要使用的任何源文件中包含头文件myExample。该源文件将看到 myExample 而不是 myVar.

同时编译新的 C 文件并link它与你的程序。