从Visual Studio中的多个源文件访问变量

时间:2017-02-13 21:48:14

标签: c++ visual-studio

示例:

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版本,这是不可接受的,因为我需要它们共享相同的变量。

请告诉我我做错了什么!

3 个答案:

答案 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几乎总能解决问题。这也适用于大多数变量,例如您存储在另一个文件中的intfloat ...,等级.cpp.h