我在使用 Visual Studio 2022 的 C 语言中遇到全局文件指针问题,该解决方案涉及使用“Build”命令编译和链接的大量文件。
基于https://codeforwin.org/c-programming/global-variables-c#google_vignette的链接,我使用以下代码创建了一个名为globals.c的文件:
#include <stdio.h>
FILE* logFp;
然后在 main.c 中我有以下代码:
#include "main.h"
extern FILE* logFp;
int main(void) {
errno_t fileErr = 0;
logFp = NULL;
char logFn[FNAME_LEN] = { 0 };
printf("Type the output log filename: ");
scanf_s("%s", logFn, FNAME_LEN);
fileErr = fopen_s(&logFp, logFn, "w");
if (fileErr) {
printf("*** There is an error when attempting to open the log file ***\n");
return 1;
}
int x = 5;
UINT bits = 255;
gprint(logFp, 161, "d b b\n", x, bits, 2 * bits);
gprint(logFp, 1, "d b b\n", x, bits, 2 * bits);
fclose(logFp);
return 0;
}
这是一个大型解决方案中 main() 中的测试部分,其中包含许多其他涉及 gprint() 函数的文件,我知道这些文件在本地定义 logFp 时可以工作。
当我尝试编译此文件时,我收到一个链接错误,指出 logFp 是未解析的符号,这是我在包含 logFp 的解决方案中的其他文件中得到的。顺便说一下,main.h 是我的头文件,其中包含许多函数原型、各种定义和宏,以及许多包含。在我尝试使用全局文件指针之前,该解决方案可以正常工作。一些建议将不胜感激。
您的问题是您没有正确使用语法。什么是
extern
?您将一个所谓的全局变量隐藏在 C 文件中。不存在“真正的”全局外部变量,这就是它导致无法解析的符号的原因。
正确的方法是在头文件中
extern
alize你的变量(是的,.h
文件不是.c
文件),然后在成为其“容器”的C文件之一中初始化它们“对象。
你的“main.h”文件(我懒得想名字了):
#include <stdio.h>
extern FILE* logFp;
main.c(请注意,这里没有标记为
extern
;既然我们正在初始化它,为什么它会是一个外部变量?):
#include "main.h"
FILE* logFp = NULL;
简而言之,它不在头文件中,其他所有代码都可以看到它,这使得它“未解决”,因为没有人知道任何事情。
我不会否认我对为什么你想要拥有
FILE
全球有极大的好奇。
我只会以阅读推荐来结束本文。