【C言語】複数ファイルにおける構造体の定義と宣言
1527 ワード
1.構造体は.c .hファイルに複数回宣言し、複数回定義できない
2.ヘッダファイルで変数定義を行わないでください.a.hにはmainとして変数strが定義.cとfunc.cファイルにはa.hが含まれており、プリプロセッサはmainに相当するa.hを2つのソースファイルの先頭にそれぞれ添付する.cとfunc.cではstrグローバル変数を繰り返し定義した.コンパイルは大丈夫です.コンパイルが終わってlinkを開始すると、linkerはmainを発見します.OBjとfunc.objにはstr記号があり、Cネーミングと競合する場合と同じエラーが表示されます.
2.例えば:typedefは構造タグstrを宣言した後、strで構造変数を宣言すると、階層がはっきりする
プログラム:
2.ヘッダファイルで変数定義を行わないでください.a.hにはmainとして変数strが定義.cとfunc.cファイルにはa.hが含まれており、プリプロセッサはmainに相当するa.hを2つのソースファイルの先頭にそれぞれ添付する.cとfunc.cではstrグローバル変数を繰り返し定義した.コンパイルは大丈夫です.コンパイルが終わってlinkを開始すると、linkerはmainを発見します.OBjとfunc.objにはstr記号があり、Cネーミングと競合する場合と同じエラーが表示されます.
2.例えば:typedefは構造タグstrを宣言した後、strで構造変数を宣言すると、階層がはっきりする
プログラム:
main.c:
/* */
#include
#include "a.h"
//#include "func.c" // error LNK1169: one or more multiply defined symbols found
//cps student; // .c
int main()
{
printf("Hello!
");
input();
pw(student.name);
printf(" age:%d
score:%0.1lf
", student.age, student.score);
return 0;
}
func.c:
/* */
#include "a.h"
//#include // ,
//cps student;// .c
void input()
{
printf("age:");
scanf("%d", &student.age);
printf("
name:");
scanf(" %c", &student.name);
printf("
score:");
scanf("%lf", &student.score);
}
int pw(char c)
{
return printf("
%c :
", c);
}
a.h:
/* */
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
typedef struct
{
int age;
char name;
double score;
} cps; //
// .c
cps student;// .h student .c , ,
void input(); //
int pw(char c); //
#endif