c - 如何在 C 中为匿名结构声明全局变量?

标签 c struct

我在 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;
}

Live Demo on Wandbox

其实这种做法类似于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/

相关文章:

c++ - 创建多个 TCP Socket 连接

c - 链表分段故障 C

c - Doxygen 构造多种语言

c - 如何使用 posix_memalign 在 C 中正确对齐结构?

c++ - 在结构中为前 5 个创建最高值的索引

c - 将两个结构体数组作为参数传递给函数

c++ - 字符串字母的排列 : How to remove repeated permutations?

c - K&R 练习 1-9 C 编程解决方案

C - 检查结构体数组的所有值是否返回相同的值

C - 字段类型不完整