user-0 提问: C语言多文件编译时报错“Redefination of ‘xxx’”

回复:
user: user-0
content: 另外，mylibrary是一个空文件，还没有编辑，可以忽略掉。

user: user-0
content: 引用 6 楼 自信男孩 的回复:#ifndef mydate_h #define mydate_h  #include <stdio.h> struct my_time{     int year;     int month;     int day; }; int leap[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int nleap[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; typedef struct my_time date; date create_date(int,int,int); date pass_date(date,int); int is_overdue(date,date); int is_leap(date); int diff_date(date,date); #endif /* mydate_h */ //#include "mydate.h" #include <string.h> #include <stdio.h> #include <stdlib.h>  #include "mytime.h"  date create_date(int y,int m,int d){     date New;     New.year = y;     New.month = m;     New.day = d;     return New; } int is_leap(date x){     return (x.year % 400 == 0) || (x.year % 100 && x.year % 4 == 0); } date pass_date(date ori,int diff){     if(is_leap(ori)){         ori.day += diff;         if(ori.day > leap[ori.month]){             ori.day %= leap[ori.month];             ori.month += 1;             if(ori.month > 12){                 ori.month %= 12;                 ori.year += 1;             }         }     }else{         ori.day += diff;         if(ori.day > nleap[ori.month]){             ori.day %= nleap[ori.month];             ori.month += 1;             if(ori.month > 12){                 ori.month %= 12;                 ori.year += 1;             }         }     }     return ori; }  int is_overdue(date deadline,date nowdate){     if(deadline.year < nowdate.year){         return 1;     }else if(deadline.year > nowdate.year){         return 0;     }else{         if(deadline.month < nowdate.month){             return 1;         }else if(deadline.month > nowdate.month){             return 0;         }else{             return deadline.day < nowdate.day;         }     } }  int diff_date(date ori,date now){     int ans = 0;     if(ori.year != now.year){         ans += (12 - ori.month + now.month) + (now.year - ori.year - 1) * 12;     }else{         ans += now.month - ori.month;     }     return ans; }  int main(void) {     return 0; } 供参考  您好，按照您的代码，出现这个错误信息 这个错误信息我一开始也碰见过，不知道是我的编译器（MacOS下的Xcode）的问题,还是别的问题.

user: user-1
content: #ifndef mydate_h #define mydate_h  #include <stdio.h> struct my_time{     int year;     int month;     int day; }; int leap[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int nleap[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; typedef struct my_time date; date create_date(int,int,int); date pass_date(date,int); int is_overdue(date,date); int is_leap(date); int diff_date(date,date); #endif /* mydate_h */ //#include "mydate.h" #include <string.h> #include <stdio.h> #include <stdlib.h>  #include "mytime.h"  date create_date(int y,int m,int d){     date New;     New.year = y;     New.month = m;     New.day = d;     return New; } int is_leap(date x){     return (x.year % 400 == 0) || (x.year % 100 && x.year % 4 == 0); } date pass_date(date ori,int diff){     if(is_leap(ori)){         ori.day += diff;         if(ori.day > leap[ori.month]){             ori.day %= leap[ori.month];             ori.month += 1;             if(ori.month > 12){                 ori.month %= 12;                 ori.year += 1;             }         }     }else{         ori.day += diff;         if(ori.day > nleap[ori.month]){             ori.day %= nleap[ori.month];             ori.month += 1;             if(ori.month > 12){                 ori.month %= 12;                 ori.year += 1;             }         }     }     return ori; }  int is_overdue(date deadline,date nowdate){     if(deadline.year < nowdate.year){         return 1;     }else if(deadline.year > nowdate.year){         return 0;     }else{         if(deadline.month < nowdate.month){             return 1;         }else if(deadline.month > nowdate.month){             return 0;         }else{             return deadline.day < nowdate.day;         }     } }  int diff_date(date ori,date now){     int ans = 0;     if(ori.year != now.year){         ans += (12 - ori.month + now.month) + (now.year - ori.year - 1) * 12;     }else{         ans += now.month - ori.month;     }     return ans; }  int main(void) {     return 0; } 供参考

user: user-2
content: 引用 4 楼 weixin_45750394 的回复:[quote=引用 1 楼 蜗牛千泷 的回复:] typedef struct time time;  typedef类型重定义的新类型名和原来结构体的名一样  PS：培养个好的编程规范，定义类型时，尽量用大写，避免和普通的变量名重名  而且，不仅仅是time这个结构体报错重复定义， 我的那些函数也报错重复定义呀。[/quote] 不好意思，报错信息没仔细看，干扰了你！  这两文件暂时看不出来出错的原因，提供不了帮助了。

user: user-0
content: 引用 1 楼 蜗牛千泷 的回复:typedef struct time time;  typedef类型重定义的新类型名和原来结构体的名一样  PS：培养个好的编程规范，定义类型时，尽量用大写，避免和普通的变量名重名  而且，不仅仅是time这个结构体报错重复定义， 我的那些函数也报错重复定义呀。

user: user-0
content: 引用 1 楼 蜗牛千泷 的回复:typedef struct time time;  typedef类型重定义的新类型名和原来结构体的名一样  PS：培养个好的编程规范，定义类型时，尽量用大写，避免和普通的变量名重名  您好,这是因为C语言不支持struct A定义之后直接用A来表示结构体.   在C++中  struct node｛     int x； ｝； node  m;  这样的写法是允许的. 但如果在C语言中必须要这么写  struct node｛     int x； ｝； struct node  m;  语句    typedef struct time time；    的作用仅仅是让我以后可以像C++那样方便地直接使用time来表示这个结构体。

user: user-2
content: typedef struct time time;  typedef类型重定义的新类型名和原来结构体的名一样  PS：培养个好的编程规范，定义类型时，尽量用大写，避免和普通的变量名重名

user: user-0
content: 引用 9 楼 贾可 的回复:结构体可以放在 .h 中，没必要放在 .c 里面。另外数组，最好也放在 .c 里面，免得多个文件引用时出错。 // 头文件里可以放这些： extern int leap[]; extern int nleap[]; // 不用分三处，啰里啰唆写一堆，一行就够了。 typedef struct time { 	int year; 	int month; 	int day; } time;  // 源文件里放数组的定义就行了 int leap[] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 }; int nleap[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };  谢谢，解决了问题。 应该把数组写在.c文件里，否则就会出错。

user: user-3
content: 结构体可以放在 .h 中，没必要放在 .c 里面。另外数组，最好也放在 .c 里面，免得多个文件引用时出错。 // 头文件里可以放这些： extern int leap[]; extern int nleap[]; // 不用分三处，啰里啰唆写一堆，一行就够了。 typedef struct time { 	int year; 	int month; 	int day; } time;  // 源文件里放数组的定义就行了 int leap[] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 }; int nleap[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };