[英]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;
}
实际上,这种方法类似于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.