Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;对“Foo”的未定义引用;在使用G+编译时+;_C++_G++ - Fatal编程技术网

C++ &引用;对“Foo”的未定义引用;在使用G+编译时+;

C++ &引用;对“Foo”的未定义引用;在使用G+编译时+;,c++,g++,C++,G++,我有三个文件: my.cpp #include "my.h" #include <iostream> void print_foo() { cout << foo << '\n'; } void print(int i) { cout << i << '\n'; } #include "my.h" int main(int argc, char *argv[]) { foo = 7; prin

我有三个文件:

my.cpp

#include "my.h"
#include <iostream> 

void print_foo() {
    cout << foo << '\n';
}

void print(int i) {
    cout << i << '\n'; 
}
#include "my.h"

int main(int argc, char *argv[]) {
    foo = 7;
    print_foo();
    print(99);
    return 0;
}
使用.cpp

#include "my.h"
#include <iostream> 

void print_foo() {
    cout << foo << '\n';
}

void print(int i) {
    cout << i << '\n'; 
}
#include "my.h"

int main(int argc, char *argv[]) {
    foo = 7;
    print_foo();
    print(99);
    return 0;
}
现在,当我运行
g++my.cpp use.cpp时,我得到了错误

/usr/bin/ld: /tmp/ccUKJUlZ.o: in function `print_foo()':
my.cpp:(.text+0x6): undefined reference to `foo'
/usr/bin/ld: /tmp/ccN0mIhY.o: in function `main':
use.cpp:(.text+0x11): undefined reference to `foo'
collect2: error: ld returned 1 exit status
另外,如果我运行
g++-cmy.cpp
一切正常,但是如果我运行
g++my.o use.cpp
我会得到同样的错误

您从未实际定义变量
foo
——在
use.cpp
my.cpp
中,您使用
foo
,而在
my.h
中,您将其声明为
extern

有关声明与定义的更多信息,请参见的开头。如果您在
use.cpp
中的
foo=7
行前面添加了一个类型,您可能会认为您的问题会得到解决;但是,您还需要做的是使
foo
成为一个全局变量,而不是一个局部变量(当您在
main
中简单地声明它时),因为
extern
将只“查找”具有全局范围的变量。通过在任何函数之外声明变量,可以使变量成为全局变量(请注意,只有在绝对必要时才应使用全局变量)

因此,您可以通过将
use.cpp
更改为以下内容来解决问题:

#include "my.h"

int foo = 7;
int main(int argc, char *argv[]) {
    print_foo();
    print(99);
    return 0;
}

当我用
int foo=7
在全局范围内定义foo时,为什么我在.h中声明类型时需要将类型放在它前面?当定义任何变量(在任何范围内)时,就像用
int foo=7
一样,这是触发编译器为变量分配存储的代码行,因此,编译器需要该类型来知道要分配多少存储空间。您仍然必须在
extern
中提到类型,因为
extern
只是声明变量的另一种形式。不将类型放入
extern
就像不将类型放在任何其他声明前面一样(例如,不能将“
bar;
”行替换为“
int bar;
”)