繁体   English   中英

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

[英]How to declare global variable for an anonymous structure in C?

我在Windows 8.1上使用Pelles C.

如何在C中为结构声明单个全局变量?

代码1:它可以工作,但我不希望创建任何其他相同类型的对象。 如果代码2有问题,那么我将不得不使用这个。

Single.h

struct single{
    int x;
};

extern struct single oneAndOnly;

void initSingle(void);
void printSingle(void);

Single.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);
}

MAIN.C

#include "Single.h"
int main()
{
    initSingle();
    printSingle();
    return 0;
}

代码2:它有效,但我不清楚在头文件中声明和定义变量的组合。 它会引起问题吗? 我没有得到任何错误。

Single.h

struct{
    int x;
}oneAndOnly;

void initSingle(void);
void printSingle(void);

Single.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有效,当我和其他许多人认为它不会?


感谢大家的所有意见,想法和答案

您可以在其他编译单元中调用该函数。 它使用全局变量而不是主程序。 因此,您甚至不必知道数据结构和变量,因为您在主程序中更新使用它们。

你可以把它减少到:

void initSingle(void);
void printSingle(void);

int main()
{
    initSingle();
    printSingle();
    return 0;
}

#include <stdio.h>

struct{
    int x;
}oneAndOnly;

static struct single oneAndOnly;

void initSingle(void){
    oneAndOnly.x = 10;
}
void printSingle(void){
    printf("x = %d\n",oneAndOnly.x);
}

你的尝试都不会在实践中发挥作用。

有了例如gcc或clang我就可以做到

typeof(oneAndOnly) secondInstance;

gcc也支持

__auto_type secondInstance = oneAndOnly;

(不确定铿锵)。

即使有问题的编译器不支持这些扩展,我也可以从头文件中复制/粘贴匿名结构声明。

也就是说,我没有看到什么阻止相同类型的其他对象购买你。 在Java中将构造函数设置为private是有道理的,因为构造函数具有您可能想要限制的行为,但在C中,结构只是数据的愚蠢集合。

还有第三种可能感兴趣的变体。

它在Single.c完全“隐藏”了struct single 因此,不可能意外访问。

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

Wandbox上的现场演示

实际上,这种方法类似于P__J __的答案 我只是按下发送按钮太慢了。


我需要一些时间才能意识到任务中的解决方案应该防止oneAndOnly类型的(偶然)第二个变量。

使用静态实例“隐藏”C文件中的struct可能是C中最好的结构。即使是melpomene的答案中的反例也不适用于这种情况。

如果需要对单个实例进行读/写访问,我会添加类似“getter”/“setter”函数的内容。

这让我想起了Singleton模式,虽然我不确定这是否是非OO语言的合法用法,如C. Googling一点,我发现(以及) 如何在C中创建一个Singleton? 我觉得值得一提。


我搜索了一下OP的实际问题,看看她/他的代码2是否也有效。 我怀疑像重复的定义(可能是因为我在日常工作中用C ++做了太长时间)。

实际上,我在Wandbox中尝试了OP的Code 2 - 没有重复的定义问题。 最后,我发现默认情况下全局变量是extern还是等于在全局中使用extern声明变量? 并得出结论,守则2也应该没问题。

限制是代码2只允许默认初始化(如果我没记错的话,填充0)。 一旦添加了初始化程序,编译器就会抱怨(如预期的那样),因为它包含多次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM