C++头文件和编译单元

原创 2007年10月07日 16:12:00
 
C++的头文件中不应该有定义,只能有声明,特别是设计到变量的定义时,变量只能在某个CPP文件中定义,不能在h文件中定义,在h文件中定义的后果是这个h文件只能被一个cpp文件包含。
//dc。H文件
Extern int gl_counter;
//main.cpp文件
#incude”dc.h”
Int gl_counter;
//fun.cpp
#incllude”dc.h”
Void f()
{
***************
Gl_counter
***************
}
注意全局变量在cpp文件中只能且必须被定义一次。H文件中的extern ****只是声明,不是定义。定义的语义动作是要给变量分配存储空间。
       C++的编译是分别对每个编译单位进行编译生成,obj的二进制文件,然后链接各个编译模块形成的obj生成可执行模块。
      如果将变量的定义放在h头文件中那么在编译时没有错误,而在链接时侧会出现链接错误,这种错误微软的编译器有时会发现有时不会发现(如果选用rebuild all选项进行编译那么一定会发现重复定义),而在linux下用g++则一定会发 现,这可能是linux下没有用到增量编译的技术。
    
 

相关文章推荐

C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间

1.  编译单元,一个.cc,或.cpp作为一个编译单元.生成.o 2.  普通数据类型的定义,声明,函数的定义声明(类函数是一样的) extern int x; //变量是声明,并未实际分配...
  • haclaud
  • haclaud
  • 2012年08月14日 11:00
  • 961

C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间

1.  编译单元,一个.cc,或.cpp作为一个编译单元.生成.obj 2.  普通数据类型的定义,声明,函数的定义声明(类函数是一样的) extern int x; //变量是声明,并未实际...
  • ling620
  • ling620
  • 2014年02月19日 13:23
  • 549

C++不同编译单元内定义的非局部静态对象的初始化顺序

静态对象是指具有静态存储期限的对象,即从定义式开始,分配的内存空间一直保留到程序结束的对象,包括全局变量、定义于命名空间的对象以及使用static修饰符声明的对象。静态对象分为两类,具有程序块作用域的...

对象被使用之前先被初始化--定义于不同编译单元内的non-local tatic对象

涉及到至少两个源码文件,每一个至少一个non-local static对象。真正的问题是:如果某个编译单元内的某个non-local static对象的初始化动作使用了另一个编译单元内的某个non-l...

Java编译单元为什么只能有一个public类,而且源文件名必须要与类名相同

在一个java源文件当中可以有多个类,但是为什么只能有一个public类呢?而当这个类被修饰为public的话,为什么源文件名必须要与类名相同呢?  Java编程思想中的一段话: 当编写一个ja...

不同编译单元内定义的non-local static 对象的初始化顺序

static对象包括global对象,定义于namespace作用域的对象,在class内的对象,在函数内,以及file作用域内被声明为static的对象。 local-static 对象指的是定义...

c++中两个类的头文件互相包含编译出错的解决办法

首先我们需要问一个问题是:为什么两个类不能互相包含头文件?所谓互相包含头文件,我举一个例子:我实现了两个类:图层类CLayer和符号类CSymbol,它们的大致关系是图层里包含有符号,符号里定义一个相...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++头文件和编译单元
举报原因:
原因补充:

(最多只允许输入30个字)