请看下面程序(程序没写完呢,但是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;
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
果然可以了,谢谢。
请问,这种状况能不能改善一下。我想继续用top.cpp文件。
#6
貌似在全局变量之前加了extern之后还是会出现那个错误,什么问题??
#7
你可以先把写好的头文件保存为cpp编译一下看有无错误
或者直接保存为h然后先包含头文件,编译一下看能不能通过,然后找错误就可以了,
其实包含头文件就好像是把2个文件的代码进行结合编译,
只是真正执行的机制不太相投而已
或者直接保存为h然后先包含头文件,编译一下看能不能通过,然后找错误就可以了,
其实包含头文件就好像是把2个文件的代码进行结合编译,
只是真正执行的机制不太相投而已
#8
建议放入头文件的东西:
1.类的声明
2.函数的声明
3.const变量
建议不要放入头文件的东西:
1.函数的实现
2.全局变量。全局变量最好放入头文件对应的cpp中。其它地方要用到全局变量,则extern声明。
1.类的声明
2.函数的声明
3.const变量
建议不要放入头文件的东西:
1.函数的实现
2.全局变量。全局变量最好放入头文件对应的cpp中。其它地方要用到全局变量,则extern声明。
#9
一般所谓的防止重复包含,指的是在生成
一个obj文件的时候,防止
一个h文件重复包含进来。
但编译器在编译的时候,会把工程内的每个cpp都编译成一个独立的obj.因此,当你有多个cpp文件的时候,生成的每个obj都会有h文件中的定义。到这一步,没有错。所以,编译通过。
但是在链接的时候,链接器会发现你的多个obj中有重复的定义,所以链接无法通过。
但编译器在编译的时候,会把工程内的每个cpp都编译成一个独立的obj.因此,当你有多个cpp文件的时候,生成的每个obj都会有h文件中的定义。到这一步,没有错。所以,编译通过。
但是在链接的时候,链接器会发现你的多个obj中有重复的定义,所以链接无法通过。
#10
楼主你头文件和c文件重名变量了
#11
#12
声明放在头文件,定义不要放在头文件就好了,推荐lz看<<C专家编程>>。
#13
12楼推荐的书很适合LZ,建议lz好好看看
#14
#15
看你的程序很多其实都不用写成全局变量的。另外你加extern后,后面的初始化动作去掉了吗?比如:
FILE * pfile = NULL; --> extern FILE * pfile; 然后在cpp文件里面写FILE * pfile = NULL;
一个是声明一个是定义。
#16
过来学习的!
#17
头文件只包含申明,不要有定义
#18
头文件中不能有定义的,只能申明
#19
多谢诸位,嘿嘿,小白受教了、、、
#20
#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;
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
果然可以了,谢谢。
请问,这种状况能不能改善一下。我想继续用top.cpp文件。
#6
貌似在全局变量之前加了extern之后还是会出现那个错误,什么问题??
#7
你可以先把写好的头文件保存为cpp编译一下看有无错误
或者直接保存为h然后先包含头文件,编译一下看能不能通过,然后找错误就可以了,
其实包含头文件就好像是把2个文件的代码进行结合编译,
只是真正执行的机制不太相投而已
或者直接保存为h然后先包含头文件,编译一下看能不能通过,然后找错误就可以了,
其实包含头文件就好像是把2个文件的代码进行结合编译,
只是真正执行的机制不太相投而已
#8
建议放入头文件的东西:
1.类的声明
2.函数的声明
3.const变量
建议不要放入头文件的东西:
1.函数的实现
2.全局变量。全局变量最好放入头文件对应的cpp中。其它地方要用到全局变量,则extern声明。
1.类的声明
2.函数的声明
3.const变量
建议不要放入头文件的东西:
1.函数的实现
2.全局变量。全局变量最好放入头文件对应的cpp中。其它地方要用到全局变量,则extern声明。
#9
一般所谓的防止重复包含,指的是在生成
一个obj文件的时候,防止
一个h文件重复包含进来。
但编译器在编译的时候,会把工程内的每个cpp都编译成一个独立的obj.因此,当你有多个cpp文件的时候,生成的每个obj都会有h文件中的定义。到这一步,没有错。所以,编译通过。
但是在链接的时候,链接器会发现你的多个obj中有重复的定义,所以链接无法通过。
但编译器在编译的时候,会把工程内的每个cpp都编译成一个独立的obj.因此,当你有多个cpp文件的时候,生成的每个obj都会有h文件中的定义。到这一步,没有错。所以,编译通过。
但是在链接的时候,链接器会发现你的多个obj中有重复的定义,所以链接无法通过。
#10
楼主你头文件和c文件重名变量了
#11
#12
声明放在头文件,定义不要放在头文件就好了,推荐lz看<<C专家编程>>。
#13
12楼推荐的书很适合LZ,建议lz好好看看
#14
#15
看你的程序很多其实都不用写成全局变量的。另外你加extern后,后面的初始化动作去掉了吗?比如:
FILE * pfile = NULL; --> extern FILE * pfile; 然后在cpp文件里面写FILE * pfile = NULL;
一个是声明一个是定义。
#16
过来学习的!
#17
头文件只包含申明,不要有定义
#18
头文件中不能有定义的,只能申明
#19
多谢诸位,嘿嘿,小白受教了、、、