如何初始化指向外部变量的全局指针?
How to initialize global pointer to extern variable?
假设我有以下结构:
typedef struct
{
uint8_t *ptr;
} Example;
如果我在 file1.c:
// Global variable
uint8_t myVar;
如何在 file2.c 中用指向 myVar
的 ptr
成员初始化 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它与你的程序。
假设我有以下结构:
typedef struct
{
uint8_t *ptr;
} Example;
如果我在 file1.c:
// Global variable
uint8_t myVar;
如何在 file2.c 中用指向 myVar
的 ptr
成员初始化 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它与你的程序。