`
lovnet
  • 浏览: 6880963 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C++ 内连接与外连接

 
阅读更多

啥叫内连接 外连接

我们知道编译的时候(假如编译器是VS),是以源文件cpp文件为单位,编译成一个个的obj文件,然后再通过链接器把不同的obj文件链接起来.

简单的说,如果一些变量或函数的定义是内连接的话,链接器链接的时候就不会拿它们去与obj比较看有重复定义不,一个源文件中的extern声明的变量或函数也不能使用另外一个源文件中的内连接的变量或函数.而如果是外连接的话则需要在不同的obj中比较是否有重定义的.除了做这样的检查外,链接器还会查看通过extern修饰的变量或函数声明在其他obj中的定义.

cpp源文件与h头文件关系

我们知道C++支持多种编程范式,可以完全用采用面向过程,不去用类,当然了很少有人这样做,一般是结合面向过程与面向对象.

那假如有一些处在不同源文件中的变量和函数(不是类中的变量成员或成员函数),我们要使用不同源文件中的变量或函数时咋整呢? 在面向对象中我们使用一个个类的时候自然是用头文件引用下就OK.但现在没有类,只是一个个变量和函数,也能用引用头文件吗 ? 这得看情况,有时可以,有时不行.如果头文件中只有外部声明没有任何定义,那引用头文件完全没有问题.如果头文件中有定义的话,如果只被一个cpp文件引用则没问题,如果被多个cpp文件引用就会出现重复定义的错误.(注:编译器是以cpp文件为单位编译,如果某个h头文件没有被引用的话相当于被抛弃不用了.引用头文件时预编译时只是简单的把头文件复制到引用它的cpp文件中.)

extern外部声明

假如在有one.cpp和two.cpp两个源文件.

//one.cpp中

---------------------------------------------------

#include <iostream>

using namespace std;

int number = 123; //number的定义

void Print() {cout<<"hi,i am one.cpp"<<endl;}

//two.cpp中

--------------------------------------------------------

#include <iostream>

using namespace std;

extern int number;//这就是所谓的外部声明,此处extern不可省

extern void Print(); //此处extern可以省略.

cout<<number; //结果为123

Print(); //输出i am one.cpp

在two.cpp中是怎么得到one.cpp中的number的值的呢,由于用extern int number这样声明了下,表明number在其他源文件中有定义,链接器就会帮助去其他源文件中找的.

假如把上面two.cpp中的extern关键字去掉. 编译时不会出错.但链接时出错了,重复定义了.因为one.cpp中已经定义了个number,不能再定义一个相同的了.

static 内部连接

上面的例子中我们知道one.cpp和two.cpp中同时写上int number会出错,说重复定义了.但如果这样

//one.cpp中

static int number = 123;

//two.cpp中

static int number; //没显式赋值,会默认赋予0

此时却不会出错.因为定义变量时默认是外部连接的.而加上关键字static表示是静态变量,是内部连接,链接器不会去看不同cpp编译成的obj文件中有重名的静态变量不.

当用static修饰后就不能再使用extern修饰了.

//one.cpp中

static int number = 123;

//two.cpp中

extern int number;

cout<<number;

此时会出错,因为extern声明的number找不到定义.因为one.cpp的number用static修饰表明是内连接了.

const关键字

//one.cpp中

const int number = 123;

//two.cpp中

const int number = 321;

这里达到的效果与static一样,都属于内部连接,所以不会出错.唯一不同的时const表示常量,定义时必须显式赋予值,且赋值后不能再改变它的值.

不过const还有另外一个特性就是可以和extern一起用.

比如在two.cpp中这样写

extern const int number; //

cout<<number; //输出的值是one.cpp中的number值123

inline与static函数也是内部连接的

//one.cpp中

void Test() { }

//two.cpp中

void Test() { }

这样编译时会报错,重复定义了.但如果把上面的两个void Test都改成inline void Test() { }或者static void Test() { }则不会出错.//注意这里讲的inline函数指的是全局函数,不是类里面的inline函数.

所以函数跟一般变量差不多.没任何修饰的就默认是外部连接,有static修饰的则是内部连接.另外没有const函数这一说,只有在类中才可以在函数后面加个const来修饰

分享到:
评论

相关推荐

    C++Builder连接局域网中MySQL.pdf

    标题中的"C++Builder连接局域网中MySQL"指的是使用C++Builder编程环境,通过ODBC(Open Database Connectivity)驱动程序连接并操作局域网内的MySQL数据库。这个过程涉及到多个步骤,包括环境准备、ODBC配置以及C++...

    C++连接数据库,连接类

    在C++编程中,连接数据库是一项...综上所述,C++连接数据库主要涉及ODBC接口、MFC的CDatabase和CRecordset类的使用,以及面向对象的设计原则。在实际开发中,理解这些概念并结合实践,可以有效地完成数据库相关的功能。

    oracle 数据库,在C++中用连接池实现高速连接与访问.rar

    本话题将深入探讨如何在C++环境中利用连接池技术实现对Oracle数据库的高速连接与访问。 一、Oracle数据库基础 Oracle数据库提供了一套完整的数据管理解决方案,包括事务处理、数据仓库、网络数据库、安全性等。它的...

    C++连接SQLSERVER数据库.cpp

    C++连接SQL+SERVER数据库.cpp

    C++检测网络连接是否正常

    5. **数据发送与接收**:为了进一步验证连接,程序可能还会发送特定的数据包,并期望从目标主机收到确认。这可以通过套接字的send和recv函数实现。 6. **错误处理**:良好的错误处理是任何网络程序的关键部分。当...

    Windows连接wifi C++ Source

    本项目"Windows连接Wi-Fi C++ Source"提供了一个C++解决方案,允许用户通过指定的SSID(Service Set Identifier,即无线网络名称)和密码来连接或断开Wi-Fi网络。下面我们将详细探讨相关的技术知识点。 首先,我们...

    C++ADO连接SQL

    在C++编程中,ADO(ActiveX Data Objects)是一种常用的技术,用于与各种数据库系统进行交互,包括SQL Server。ADO是Microsoft开发的组件,它基于OLE DB,提供了一种简单的方式来访问和操作数据。本篇将详细介绍如何...

    dev c++ 连接 mysql 方法、库

    这里的`devc++`指的是Dev C++ IDE,`c++`是编程语言,而`mysql 库`则指用于C++连接MySQL数据库的API,通常包括libmysqlclient库。这个库提供了连接、查询、执行SQL语句等操作MySQL数据库所需的功能。 为了在Dev C++...

    c++ ado连接oracle

    C++与Oracle数据库之间的连接是通过ADO(ActiveX Data Objects)实现的,这是一种在Microsoft环境中广泛使用的数据库访问技术。在本文中,我们将深入探讨如何在C++程序中使用ADO连接Oracle数据库,包括两种不同的...

    C++连接sql数据库

    C++连接SQL数据库 在本文中,我们将介绍如何使用C++语言连接SQL数据库,并详细介绍了ODBC和ADO两种连接方式的使用。 标题:C++连接SQL数据库 描述:C++中用ODBC和ADO方式连接SQL数据库简述! 标签:odbc 部分...

    c++连接mysql的例子

    本文将深入探讨如何使用C++连接MySQL数据库,并提供一个简单的入门示例。 首先,为了在C++中使用MySQL,我们需要安装MySQL的C++连接器,它提供了必要的库文件和头文件。这个连接器通常称为libmysqlcppconn,可以在...

    c++ ODB 连接 mysql

    本篇文章将深入探讨如何使用ODB在C++中连接并操作MySQL数据库。 首先,我们需要了解ODB的基本概念。ODB的核心功能是将C++类自动转换为数据库表,并将类的对象自动转换为数据库记录。它通过预编译的SQL语句和元数据...

    C++phpstudy连接数据库测试_C++mysqlphpstudy_

    本示例聚焦于"C++phpstudy连接数据库测试",这是一个在phpStudy环境下使用C++连接MySQL数据库的实践案例。phpStudy是一个流行的集成开发环境,集成了PHP、Apache、MySQL等组件,方便开发者进行Web开发。 首先,我们...

    c++ Pin和Qss连接wifi

    在C++中,实现QSS连接通常需要与特定硬件的驱动程序交互,这可能涉及到底层网络编程和设备控制。 **WCNConfigure.exe**: 在提供的描述中提到了`WCNConfigure.exe`,这是一个Windows系统工具,用于配置WCN(Windows...

    C++ TCP客户端非阻塞连接超时测试源码

    总之,"C++ TCP客户端非阻塞连接超时测试源码"是一个实用的示例,它展示了如何在C++中处理TCP连接的非阻塞和超时问题,这对于开发高可用性和高性能的网络应用程序至关重要。通过学习和分析这段代码,开发者可以提升...

    mongodb的c++连接接口

    MongoDB 提供了 C++ 驱动程序,允许开发者直接通过 C++ 代码与 MongoDB 数据库进行交互。 本压缩包文件提供了在 C++ 环境下使用 MongoDB 的必要组件,特别是针对 Visual Studio 2015 开发环境。以下是关键知识点的...

    C++使用ADO连接SQL Server数据库源代码

    当需要在C++程序中与SQL Server数据库交互时,通常会采用ActiveX Data Objects(简称ADO)技术。以下将详细讲解如何使用C++通过ADO连接到SQL Server数据库,并基于提供的"ConnDatabase"源代码进行学习。 1. ADO简介...

    C++实现连接数据库源码

    8. 示例代码:虽然"ConToDb"源码未给出,但一个简单的C++连接数据库的示例可能会包含如下部分: ```cpp #include #include void connectToDatabase() { SQLHENV env; SQLHDBC dbc; SQLRETURN ret; // 初始化...

    C++连接mysql数据库 源代码

    在"C++连接mysql数据库 源代码"这个项目中,我们可以学习到以下几个关键知识点: 1. **MySQL C++ Connector**: 连接MySQL数据库时,通常会使用MySQL官方提供的C++ Connector,这是一个用于C++应用程序的数据库驱动...

Global site tag (gtag.js) - Google Analytics