这里是Define.c
#include "Define.h"
// this line working
// Format date_format = { "YYMMDD", "%02u%02u%02u", 6, 3 }; // line1
Format date_format;
// this line are now working
strcpy(date_format.format, "YYMMDD"); // line2
strcpy(date_format.scanformat, "%02u%02u%02u"); // line3
date_format.scansize = 3; // line4
date_format.printsize = 6; // line5
这里是Define.h
#ifndef _DEFINE_H
#define _DEFINE_H
typedef struct Format
{
char format[256];
char scanformat[256];
unsigned int printsize;
unsigned int scansize;
} Format;
extern Format date_format;
#endif
main.c
#include <stdio.h>
#include "Define.h"
int main(int argc, char* argv[])
{
printf(date_format.format);
getchar();
return 0;
}
我的问题是为什么第二个定义在第一行。2/3/4/5不工作吗?这就是我对这个结构体的初始化/定义/赋值的全部要求。或者它必须包含在一个方法中,但是如果是这样,那么为什么line 1可以正常工作呢?我正在使用Visual Studio 2017
2条答案
按热度按时间vc6uscn91#
我想你问的是为什么你不能初始化全局结构变量,然后将它们外部化--答案是因为编译器不知道你想要什么。在main之外的文件中声明全局
date_format
变量,但没有初始化。您可以将初始化尝试从
Define.c
移动到在main.c
的全局级别上声明。但你不想这样。另一种方法是通过静态初始化(您已经尝试过)。我也有点困惑,为什么你不想把初始化int一个函数?但无论如何...我假设你想要的是在另一个文件中初始化结构,并在程序的另一部分使用相同的值。那么问题就在于如何声明
extern
以及如何重新声明Format date_format
。你想在
Define.c
中初始化struct变量:然后在
Define.h
中告诉编译器该结构体是一个extern:然后在main中直接调用
date_format
:输出:
qacovj5a2#
你试图在函数之外执行函数调用,试着将代码从Define.c移到main,或者像这样将它们放在init函数中。
在main调用中,函数#include<stdio.h>#include“Define.h”
在Define.h中添加
extern void date_format_init()