C语言头文件问题,高手进!!!急求啊!!!

时间:2022-01-13 18:52:44
C语言的头文件应该怎么写啊?高了半天还是没怎么整明白。
请看下面程序(程序没写完呢,但是compile通过)
//top.h文件
#ifndef _TOP_H_
#define _TOP_H_

const int LENGTH = 256;

int image[LENGTH][LENGTH] = {0};
FILE * pfile = NULL;
char * filename = "Lena.raw";
int i = 0;
int j = 0;

int max(int num1, int num2);
int min(int num1, int num2);
void read_file(void);
void write_file(void);

#endif

//top.cpp文件
#include <stdio.h>
#include "top.h"

int max(int num1, int num2)
{
if(num1 > num2)
{
return num1;
}
else
{
return num2;
}
}

int min(int num1, int num2)
{
if(num1 < num2)
{
return num1;
}
else
{
return num2;
}
}

void read_file(void)
{
if(!(pfile = fopen(filename, "rb")))
{
printf("file open error!\n");
}

for(i=0; i<LENGTH; i++)
{
for(j=0; j<LENGTH; j++)
{
image[i][j] = (int)fgetc(pfile);
}
}

fclose(pfile);

/* for(i=0; i<10; i++) //显示部分图片像素值,验证程序
{
for(j=0; j<10; j++)
{
printf("%4d", image[i][j]);
}
printf("\n");
}*/
}

void write_file(void)
{

pfile = fopen("Lena1.raw", "wb");

for(i=0; i<LENGTH; i++)
{
for(j=0; j<LENGTH; j++)
{
image[i][j] = (char)image[i][j];
}
}

for(i=0; i<LENGTH; i++)
{
for(j=0; j<LENGTH; j++)
{
fwrite(image, sizeof(char), sizeof(image[LENGTH][LENGTH])/sizeof(char), pfile);
}
}

fclose(pfile);
}

//main.cpp文件
#include <stdio.h>
#include "top.h"

int main(void)
{
read_file();
for(i=0; i<10; i++) //显示部分图片像素值,验证程序
{
for(j=0; j<10; j++)
{
printf("%4d", image[i][j]);
}
printf("\n");
}

return 0;
}

build出现错误:
--------------------Configuration: PE_shift - Win32 Debug--------------------
Compiling...
top.cpp
Linking...
top.obj : error LNK2005: "int j" (?j@@3HA) already defined in main.obj
top.obj : error LNK2005: "int i" (?i@@3HA) already defined in main.obj
top.obj : error LNK2005: "char * filename" (?filename@@3PADA) already defined in main.obj
top.obj : error LNK2005: "struct _iobuf * pfile" (?pfile@@3PAU_iobuf@@A) already defined in main.obj
top.obj : error LNK2005: "int (* image)[256]" (?image@@3PAY0BAA@HA) already defined in main.obj
Debug/PE_shift.exe : fatal error LNK1169: one or more multiply defined symbols found
执行 link.exe 时出错.

PE_shift.exe - 1 error(s), 0 warning(s)

19 个解决方案

#1


重复编译的问题  你把top.h 和top.cpp 写在一起试一试

#2


比我厉害,我的C还不如你

#3


变量的定义不要出现在头文件中。类似以下

int image[LENGTH][LENGTH] = {0};
FILE * pfile = NULL;
char * filename = "Lena.raw";
int i = 0;
int j = 0;

这些语句应该放在cpp中。如果是全局变量,需要放在头文件的话,写成:

extern int image[LENGTH][LENGTH];
extern FILE * pfile;
extern char * filename;
extern int i;
extern int j;

#4


你在main.cpp中用的i  j 直接定义成临时变量就行了。还有i  j 没必要定义成全局变量吧!

#5


引用 1 楼 hnuqinhuan 的回复:
重复编译的问题 你把top.h 和top.cpp 写在一起试一试

果然可以了,谢谢。
请问,这种状况能不能改善一下。我想继续用top.cpp文件。

#6


引用 3 楼 xy_zhang 的回复:
变量的定义不要出现在头文件中。类似以下

int image[LENGTH][LENGTH] = {0};
FILE * pfile = NULL;
char * filename = "Lena.raw";
int i = 0;
int j = 0;

这些语句应该放在cpp中。如果是全局变量,需要放在头文件的话,写成:

extern int image[LENGTH][L……

貌似在全局变量之前加了extern之后还是会出现那个错误,什么问题??

#7


你可以先把写好的头文件保存为cpp编译一下看有无错误
或者直接保存为h然后先包含头文件,编译一下看能不能通过,然后找错误就可以了,
其实包含头文件就好像是把2个文件的代码进行结合编译,
只是真正执行的机制不太相投而已

#8


建议放入头文件的东西:

1.类的声明
2.函数的声明
3.const变量

建议不要放入头文件的东西:

1.函数的实现
2.全局变量。全局变量最好放入头文件对应的cpp中。其它地方要用到全局变量,则extern声明。

#9


一般所谓的防止重复包含,指的是在生成 一个obj文件的时候,防止 一个h文件重复包含进来。

但编译器在编译的时候,会把工程内的每个cpp都编译成一个独立的obj.因此,当你有多个cpp文件的时候,生成的每个obj都会有h文件中的定义。到这一步,没有错。所以,编译通过。

但是在链接的时候,链接器会发现你的多个obj中有重复的定义,所以链接无法通过。

#10


楼主你头文件和c文件重名变量了 

#11


该回复于2010-12-01 16:27:54被版主删除

#12


声明放在头文件,定义不要放在头文件就好了,推荐lz看<<C专家编程>>。

#13


12楼推荐的书很适合LZ,建议lz好好看看

#14


该回复于2010-12-01 16:27:57被版主删除

#15


引用 6 楼 adam_boy 的回复:
引用 3 楼 xy_zhang 的回复:
变量的定义不要出现在头文件中。类似以下

int image[LENGTH][LENGTH] = {0};
FILE * pfile = NULL;
char * filename = "Lena.raw";
int i = 0;
int j = 0;

这些语句应该放在cpp中。如果是全局变量,需要放在头文件的话,写成:

ext……


看你的程序很多其实都不用写成全局变量的。另外你加extern后,后面的初始化动作去掉了吗?比如:
FILE * pfile = NULL; --> extern FILE * pfile; 然后在cpp文件里面写FILE * pfile = NULL;
一个是声明一个是定义。

#16


过来学习的!

#17


头文件只包含申明,不要有定义

#18


 头文件中不能有定义的,只能申明

#19


多谢诸位,嘿嘿,小白受教了、、、

#1


重复编译的问题  你把top.h 和top.cpp 写在一起试一试

#2


比我厉害,我的C还不如你

#3


变量的定义不要出现在头文件中。类似以下

int image[LENGTH][LENGTH] = {0};
FILE * pfile = NULL;
char * filename = "Lena.raw";
int i = 0;
int j = 0;

这些语句应该放在cpp中。如果是全局变量,需要放在头文件的话,写成:

extern int image[LENGTH][LENGTH];
extern FILE * pfile;
extern char * filename;
extern int i;
extern int j;

#4


你在main.cpp中用的i  j 直接定义成临时变量就行了。还有i  j 没必要定义成全局变量吧!

#5


引用 1 楼 hnuqinhuan 的回复:
重复编译的问题 你把top.h 和top.cpp 写在一起试一试

果然可以了,谢谢。
请问,这种状况能不能改善一下。我想继续用top.cpp文件。

#6


引用 3 楼 xy_zhang 的回复:
变量的定义不要出现在头文件中。类似以下

int image[LENGTH][LENGTH] = {0};
FILE * pfile = NULL;
char * filename = "Lena.raw";
int i = 0;
int j = 0;

这些语句应该放在cpp中。如果是全局变量,需要放在头文件的话,写成:

extern int image[LENGTH][L……

貌似在全局变量之前加了extern之后还是会出现那个错误,什么问题??

#7


你可以先把写好的头文件保存为cpp编译一下看有无错误
或者直接保存为h然后先包含头文件,编译一下看能不能通过,然后找错误就可以了,
其实包含头文件就好像是把2个文件的代码进行结合编译,
只是真正执行的机制不太相投而已

#8


建议放入头文件的东西:

1.类的声明
2.函数的声明
3.const变量

建议不要放入头文件的东西:

1.函数的实现
2.全局变量。全局变量最好放入头文件对应的cpp中。其它地方要用到全局变量,则extern声明。

#9


一般所谓的防止重复包含,指的是在生成 一个obj文件的时候,防止 一个h文件重复包含进来。

但编译器在编译的时候,会把工程内的每个cpp都编译成一个独立的obj.因此,当你有多个cpp文件的时候,生成的每个obj都会有h文件中的定义。到这一步,没有错。所以,编译通过。

但是在链接的时候,链接器会发现你的多个obj中有重复的定义,所以链接无法通过。

#10


楼主你头文件和c文件重名变量了 

#11


该回复于2010-12-01 16:27:54被版主删除

#12


声明放在头文件,定义不要放在头文件就好了,推荐lz看<<C专家编程>>。

#13


12楼推荐的书很适合LZ,建议lz好好看看

#14


该回复于2010-12-01 16:27:57被版主删除

#15


引用 6 楼 adam_boy 的回复:
引用 3 楼 xy_zhang 的回复:
变量的定义不要出现在头文件中。类似以下

int image[LENGTH][LENGTH] = {0};
FILE * pfile = NULL;
char * filename = "Lena.raw";
int i = 0;
int j = 0;

这些语句应该放在cpp中。如果是全局变量,需要放在头文件的话,写成:

ext……


看你的程序很多其实都不用写成全局变量的。另外你加extern后,后面的初始化动作去掉了吗?比如:
FILE * pfile = NULL; --> extern FILE * pfile; 然后在cpp文件里面写FILE * pfile = NULL;
一个是声明一个是定义。

#16


过来学习的!

#17


头文件只包含申明,不要有定义

#18


 头文件中不能有定义的,只能申明

#19


多谢诸位,嘿嘿,小白受教了、、、

#20