我正在Programming Principles and Practices using C++ by Bjarne Stroustrup学习C ++。 我在编译过程中遇到foo变量的麻烦。 阅读了extern关键字上的许多其他链接,但仍然无法找出问题所在。

//ch8d1_my.h

extern int foo;
void print_foo();
void print(int);

//ch8d1_my.cpp
#include "ch8d1_my.h"
#include "std_lib_facilities.h"

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

void print(int i)
{ 
  cout << "i = " << i << '\n';
}


//ch8d1_use.cpp

#include "ch8d1_my.h"

int main()
{ 
 int foo = 7;
  print_foo();
  print(99);
 return 0;
}

Error: ch8d1_use.cpp: In function ‘int main()’:
ch8d1_use.cpp:5:6: warning: unused variable ‘foo’ [-Wunused-variable]
  int foo = 7;
      ^
/tmp/ccoVkK6R.o: In function `print_foo()':
ch8d1_my.cpp:(.text+0xb): undefined reference to `foo'
collect2: error: ld returned 1 exit status

#1楼 票数:2 已采纳

include“ ch8d1_my.h” //这是错误的。 应该在文件的开头

include“ std_lib_facilities.h” //这是错误的。 应该在

#include "ch8d1_my.h"
#include "std_lib_facilities.h"

extern int foo;
void print_foo();
void print(int);

//ch8d1_my.cpp
int foo = 7;       //You need to declare extern as global variable

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

void print(int i)
{ 
  cout << "i = " << i << '\n';
}

//ch8d1_use.cpp

#include "ch8d1_my.h"

int main()
{ 
  print_foo();
  print(99);
 return 0;
}

  ask by user3401108 translate from so

未解决问题?本站智能推荐:

3回复

具有多个定义的extern关键字没有错误

我有以下代码段main.c,下面是文件somefile.h 和somefile.h包含 我的问题是,当我执行此代码时,它会产生输出10000,但是为什么这不是重新定义错误。 由于我假设extern int var = 10000; 是定义。 同样现在,如果我为somefile.h中
3回复

“extern”关键字的用法

我有以下代码片段: 上面的示例代码显示了10。我猜是应该打印出垃圾值。 有人可以解释吗?
2回复

使用Extern关键字

我熟悉extern关键字,它用于声明存在于其他文件中的变量,但是以下语句是什么意思?
9回复

extern关键字用法

我有三个程序,我使用extern关键字。 我无法理解结果。 以下是三个例子: 示例1:我期望下面的代码会给出多次声明k编译错误。 但它运作正常吗? 示例2:当我尝试在上面的示例中初始化“k”时,编译器会出错。 为什么? 示例3:在此示例中,我更改了示例1中提到的定义顺序。当我
3回复

C中的extern关键字,具有更多功能

我想在C和C ++中都包含一个头文件,并且我有一个用C代码定义的函数,而有几个在外部库中定义的函数。 从C源文件编译时,此代码会产生编译错误 是否可以直接修复语法错误,或者我必须使用一些宏? 编辑1:我不问extern关键字对C函数的影响 ,我只是问是否有可能以简单的方式修复语法。
3回复

使用extern关键字和多个翻译单元

我正在阅读Scott Meyer的Effective C ++的第4项,他试图显示一个示例,其中跨不同的翻译单元使用静态非本地对象。 他强调了一个问题,即一个翻译单元中使用的对象在使用之前不知道是否已在另一翻译单元中对其进行了初始化。 第三版的第30页,以防有人复制。 这个例子是这样的:
2回复

这里需要extern关键字,const在cpp文件中

如果我有头文件 并在源文件中 源文件中的第二个extern是必需的还是可选的? 我搜索过并发现了相互矛盾的信息。 从这个网页: http : //msdn.microsoft.com/en-us/library/357syhfh.aspx 但是要在C ++中获得相同的行为,必
5回复

关于函数的C++extern关键字。为什么不包含头文件?

如果我理解正确,这意味着 函数foo在另一个翻译单元中声明。 1)为什么不#include声明此函数的头? 2)链接器如何知道在链接时寻找函数的位置? 编辑:也许我应该澄清上面的声明然后使用该函数 它从未在此翻译单元中定义。