C 中的全局文件指针

问题描述 投票:0回答:1

我在使用 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 是我的头文件,其中包含许多函数原型、各种定义和宏,以及许多包含。在我尝试使用全局文件指针之前,该解决方案可以正常工作。一些建议将不胜感激。

c global
1个回答
0
投票

您的问题是您没有正确使用语法。什么是

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
全球有极大的好奇。

我只会以阅读推荐来结束本文。

© www.soinside.com 2019 - 2024. All rights reserved.