C++编译和链接(0)-.h与.cpp中的概念跟声明

C++中一些东西要在可以以.h文件中定义,有的东西则须放在.cpp文件中定义,有的东西在不同之cpp文件中之名可以同,而有些尽管非可知同一

那到底哪东西可在峰文件中定义,声明,哪些东西又不能不以.cpp中定义,声明也?

 

*以下有所的座谈还是以大局命名空间被(即不定义自己之namespace)下开展的

 

函数

1、在.h中只能声明函数,在.cpp中得声明与定义函数

如以.h中声称并定义一个函数,则该函数只能为#include一糟糕,否则则会并发重复定义错误

比如

1.h

#pragma once

void show()
{

}

a.cpp

#include "1.h"

b.cpp

#include "1.h"

error LNK2005: “void __cdecl show(void)” (?show@@YAXXZ) 已经在 a.obj
中定义 

据此只要避免在头文件中定义函数

 

2、在不同.cpp中定义之函数原型(函数返回值,函数名称,函数参数)不能够完全相同,

仍使出当少数独.cpp文件中都存

void show(){};

见面出现更定义错误

 

内联函数

为了保有调用该inline函数的文书中之概念一样,所以用是当.h文件中定义

留意这里的inline对于编译器来说只是是建议性的,关于该内联函数吃拒会客于产一致首文章中牵线

 

 

typedef

当不同之cpp中唯独为同等

 

 

变量

1、在.h中只能声明,在.cpp中得声明和定义一个变量

倘若当.h中之概念一个变量,则该变量被include两涂鸦以上时则会产出又定义错误

2、在不同.cpp中定义之变量的名字和项目不同一样

 

 

 

常量

1、如果const常量是为此常量表达式进行初始化的,则可以于.h中扬言与定义

2、如果const变量是因此非常量表达式进行初始化的,那么该变量应该当cpp文件被定义,而以.h文件被进行宣示。

3、不同cpp中为定义名字以及项目一样的变量

 

 

 

static变量

1、在不同之cpp中得以定义名字跟品类一样的变量

2、如果当.h中定义一个static成员,则拥有include该文件的文件均拥有同样卖独立的拖欠static成员,一个文件对那个的改动不会见潜移默化及另外一个文件

故此static变量一般是放在.cpp出现并定义.

例如

1.h

#pragma once

static int a = 5;

a.cpp

#include "1.h"
#include <iostream>
using namespace std;

void showstatic()
{
    cout << "In a.cpp:" << a << endl;
    a = 1;
    cout << "In a.cpp:" << a << endl;
}

b.cpp

#include "1.h"
#include <iostream>
using namespace std;


void showstatic();
int main()
{
    showstatic();
    cout << "In b.cpp:" << a << endl;
    system("pause");
}

C++ 1

 

 

 

static函数

在不同之cpp中得以定义函数原型一样的函数

 

 

 

今非昔比的cpp中类的名字可以同

 

 

 

类似成员及函数

在.h中定义,所有成员必须于类似中声明,在cpp中实现

非静态的常量整形数据成员不可知不怕地初始化(*C++11受,标准允许以等号=或者花括号{}进行当庭的非静态成员变量初始化)

每当看似中定义的分子函数将机关作为inline处理

在.h外部定义之函数需要加上inline说明

否则在给include多次时会油然而生重定义错误

1.h

#pragma once
#include <iostream>


class A
{
public:
    void show();
};
void A::show()//无inline
{
    std::cout << "hello" << std::endl;
}

a.cpp

#include "1.h"
#include <iostream>
using namespace std;

b.cpp

#include "1.h"
#include <iostream>
using namespace std;

error LNK2005: “public: void __thiscall A::show(void)”
(?show@A@@QAEXXZ) 已经在 a.obj 中定义   

 

 

类的const成员

以看似吃声称变量为const类型的积极分子不得以就地初始化

const常量的初始化必须于构造函数初始化列表中初始化,而未得以以构造函数函数体内初始化(*C++11备受,标准允许用相当号=或者花括号{}进行当庭的非静态成员变量初始化)

#pragma once
class A
{
public:
    const int i=50;
};

error C2864: “A::i”: 只来静态常量整型数据成员才堪在相近中初始化   
d:\自之资料库\documents\visual studio
2010\projects\fasd\fasd\1.h    5    1    fasd

 

 

看似的静态的数目成员

免得以就地初始化,需要到.cpp中开展定义

(对于非常量的静态成员变量,C++11暨C++98保持了同样。需要干净文件以外去定义其)

 

 

类似的静态的常量整形数据成员

得就地初始化

class A
{
private:
    const static int i = 5;
};

 

 

 

模板(不考虑export)

模板函数和模板类的宣示与贯彻必须在一个文本被

 

 

总结

  是否可以在.h中定义 在不同.cpp中是否可以重名 特殊说明
函数 不可以,会出现重定义错误 不可以  
内联函数 可以 可以 为了确保所有调用该inline函数的文件中的定义一样,所以需要是在.h文件中定义
typedef ———————- 可以  
常量 可以 可以

1、常量表达式进行初始化的,则可以在.h中声明与定义

2、非常量表达式进行初始化的,那么该变量应该在cpp文件中定义,而在.h文件中进行声明。

变量 不可以,会出现重定义错误 不可以(类型与名字)  
static变量 可以 可以

在.h中定义一个static成员,则所有include该文件的文件均拥有一份独立的该static成员,一个文件对其的修改不会影响到另一个文件

所以static变量一般是放在.cpp出现并定义.

static函数 可以 可以  

 

 

 

 

 

  是否可以在.h中定义 是否可以就地初始化 特殊说明
可以    
类数据成员 —————— 不可以 (*C++11中,标准允许使用等号=或者花括号{}进行就地的非静态成员变量初始化)
类成员函数 —————— —————-

在.h外部定义的函数需要加上inline说明

否则在被include多次时会出现重定义错误

类const数据 —————— 不可以

1、在类中声明变量为const类型的成员不可以就地初始化

const常量的初始化必须在构造函数初始化列表中初始化,而不可以在构造函数函数体内初始化

2、同类数据成员中的特殊说明

类的静态的数据成员 ——————- 不可以

不可以就地初始化,需要到.cpp中进行定义

(对于非常量的静态成员变量,C++11与C++98保持了一致。需要到头文件以外去定义它)

 

类的静态的常量整形数据成员

—————— 可以  

 

 

 

  特殊说明
模板

模板函数与模板类的声明与实现必须放在一个文件中

 

至于何以会这么,与C++的编译和链接,和编译产生的靶子C++文件(.obj),内部链接,外部链接有关,

我会以联网下去的章中向大家介绍