示例:
stdafx.h中:
#pragma once
typedef void (__stdcall*FuncType)(int,int);
extern FuncType Func1 = NULL;
Foo.cpp中:
int main()
{
printf("%x\n",&Func1);
return 0;
}
foo2.cpp:
void call()
{
printf("%x\n",&Func1);
}
假设foo.cpp,foo2.cpp都包含stdafx.h
链接器错误:
1>fooTest.obj : error LNK2005: "void (__stdcall* Func1)(int,int)" (? Func1@@3P6GXHH@ZA) already defined in stdafx.obj
1>foo2.obj : error LNK2005: "void (__stdcall* Func1)(int,int)" (?Func1@@3P6GXHH@ZA) already defined in stdafx.obj
1>C:\Users\****\Documents\Visual Studio 2005\Projects\fooTest\Debug\fooTest.exe : fatal error LNK1169: one or more multiply defined symbols found
使用static而不是extern编译很好,但源文件使用他们自己的Func1版本,这是不可接受的,因为我需要它们共享相同的变量。
请告诉我我做错了什么!
答案 0 :(得分:4)
我想你必须定义变量infile = fopen("input.dat", "r");
fscanf(infile, "%c", &gender);
printf("%c", gender); //returning F character for gender variable
if (gender = M)
{
fscanf(infile, "%lf", &weight);
fscanf(infile, "%lf", &height);
fscanf(infile, "%lf", &age);
BMR = 66 + (6.23 * weight) + (12.7 * height) - (6.8 * age);
printf("%lf", BMR);
}
if (gender = F)
{
fscanf(infile, "%lf", &weight);
fscanf(infile, "%lf", &height);
fscanf(infile, "%lf", &age);
BMR = 655 + (4.35 * weight) + (4.7 * height) - (4.7 * age);
printf("%lf", BMR);
}
else
{
printf("Invalid Input\n\n");
}
,它只是在头文件中声明,只在你的一个源文件中,而不是两个;并且你不能将它声明为静态,因为它不会被其他翻译单元看到。我不会在头文件中将其设置为Func1
,而是在实际定义变量的(一个)源文件中设置它。
答案 1 :(得分:1)
从stdafx.h中删除= NULL
部分,并将以下行放在一个cpp文件中(仅限一个cpp)。
FuncType Func1 = NULL;
答案 2 :(得分:-1)
当我遇到像你这样的问题时,我发现将其设为static
几乎总能解决问题。这也适用于大多数变量,例如您存储在另一个文件中的int
,float
...,等级.cpp
或.h
。