我在 Windows 8.1 上使用 Pelles C。
如何在 C 中为结构体声明单个全局变量?
代码 1:它可以工作,但我不想创建任何其他相同类型的对象。如果代码 2 有问题,那么我将不得不使用这个。
单.h
struct single{
int x;
};
extern struct single oneAndOnly;
void initSingle(void);
void printSingle(void);
单例.c
#include <stdio.h>
#include "Single.h"
struct single oneAndOnly;
void initSingle(void){
oneAndOnly.x = 10;
}
void printSingle(void){
printf("x = %d\n",oneAndOnly.x);
}
主要.c
#include "Single.h"
int main()
{
initSingle();
printSingle();
return 0;
}
代码 2:有效,但我不清楚在头文件中声明和定义变量的组合。会不会出问题?不过我没有收到任何错误。
单.h
struct{
int x;
}oneAndOnly;
void initSingle(void);
void printSingle(void);
单例.c
#include <stdio.h>
#include "Single.h"
void initSingle(void){
oneAndOnly.x = 10;
}
void printSingle(void){
printf("x = %d\n",oneAndOnly.x);
}
Main.c与代码1相同
我可以毫无问题地使用代码 2 吗?
有人能告诉我为什么代码 2 有效,而我和其他许多人都认为它不起作用吗?
感谢大家的评论、想法和回答
最佳答案
还有第三种变体,您可能会感兴趣。
它将 struct single
完全“隐藏”在 Single.c
中。因此,不可能发生意外访问。
Single.h
:
void initSingle(void);
void printSingle(void);
Single.c
:
#include <stdio.h>
#include "Single.h"
struct Single {
int x;
};
static struct Single oneAndOnly;
void initSingle(void)
{
oneAndOnly.x = 10;
}
void printSingle(void)
{
printf("x = %d\n", oneAndOnly.x);
}
main.c
:
#include "Single.h"
int main()
{
initSingle();
printSingle();
return 0;
}
其实这种做法类似于P__J__'s answer .我只是太慢了,没按发送按钮。
我需要一些时间来意识到所寻求的解决方案应该防止 oneAndOnly
类型的(意外的)第二个变量。
在 C 文件中使用静态实例“隐藏”struct
可能是 C 中最好的方法。即使是 melpomene's answer 中的反例也是如此。在这种情况下不应该工作。
如果需要对单个实例进行读/写访问,我会添加类似“getter”/“setter”函数的内容。
这让我想起了 Singleton pattern虽然我不确定这是否是像 C 这样的非 OO 语言的合法用法。谷歌搜索了一下,我发现(也)How to create a Singleton in C?我觉得值得一提。
我在谷歌上搜索了一些关于 OP 的实际问题,她/他的代码 2 是否也有效。我怀疑是重复定义之类的东西(可能是因为我在日常工作中使用 C++ 的时间太长了)。
实际上,我在 Wandbox 中尝试了 OP 的代码 2| – 没有重复定义问题。最后,我找到了Are the global variables extern by default or it is equivalent to declaring variable with extern in global?并得出代码 2 也应该没问题的结论。
限制是代码 2 只允许默认初始化(如果我没记错的话用 0 填充)。一旦添加了初始化程序,编译器就会提示(如预期的那样),因为它被多次包含。
关于c - 如何在 C 中为匿名结构声明全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52294245/