C++中的内部连接与外部连接(一)-------转载

找了好久,

转载自:http://blog.csdn.net/SpitFire/archive/2004/03/18/11301.aspx

在说内部连接与外部连接前,先说明一些概念。

 

1.声明

    一个声明将一个名称引入一个作用域;

       c++中,在一个作用域中重复一个声明是合法的

      

       以下都是声明:

       int foo(int,int);           //函数前置声明

       typedef int Int;               //typedef 声明

       class bar;                      //类前置声明

       extern int g_var;           //外部引用声明

       class bar;                      //类前置声明

       typedef int Int;               //typedef 声明

       extern int g_var;           //外部引用声明

       friend test;                      //友员声明

       using std::cout;        //名字空间引用声明

       friend test;                      //友员声明

       using std::cout;              //名字空间引用声明

       int foo(int,int);           //函数前置声明

      

       在同一个作用域中你可以多次重复这些声明。

      

       有两种声明不能重复,那就是类成员函数及静态数据成员的声明

      

       class foo

       {

       static int i;

       static int i;//不可以

       public:

       int foo();

       int foo();//不可以

       };

 

2.定义

       一个定义提供一个实体(类型、实例、函数)在一个作用域的唯一描述。

       在同一作用域中不可重复定义一个实体。

       以下都是定义。

       int y;

       class foo {...};

       struct bar {...};

       foo* p;

       static int i;

       enum Color{RED,GREEN,BLUE};

       const double PI = 3.1415;

       union Rep{...};

       void test(int p) {};

       foo a;

       bar b;

3.编译单元

       当一个ccpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有       必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp文件名同名的目标文件(.o或是.obj)。连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。

4.自由函数

       如果一个函数是自由函数,那么这个函数不是类的成员函数,也不是友元函数。

 

下面来看内部连接和外部连接

       内部连接:如果一个名称对于它的编译单元来说是局部的,并且在连接时不会与其它编译单元中的同样的名称相冲突,那么这个名称有内部连接(注:有时也将声明看作是无连接的,这里我们统一看成是内部连接的)

      

       以下情况有内部连接:

       a)所有的声明

       b)名字空间(包括全局名字空间)中的静态自由函数、静态友元函数、静态变量的定义

       c)enum定义

       d)inline函数定义(包括自由函数和非自由函数)

       e)类的定义

       f)名字空间中const常量定义

       g)union的定义

      

      外部连接:在一个多文件程序中,如果一个名称在连接时可以和其它编译单元交互,那么这个名称就有外部连接。

       以下情况有外部连接:

       a)类非inline函数总有外部连接。包括类成员函数和类静态成员函数

       b)类静态成员变量总有外部连接。

       c)名字空间(包括全局名字空间)中非静态自由函数、非静态友元函数及非静态变量

      

       下面举例说明:

       a)声明、enum定义、union定义有内部连接

所有的声明、enum定义及union定义在编译后不会产生连接符号,也就是在不同编译单元中有相同名称的声明及enumunion定义并不会在连接时发生发现多个符号的错误。

              // main.cpp

              typedef int Int;                //typedef 声明,内部连接

              enum Color{red};           //enum定义,内部连接

              union X                          //union定义,内部连接

              {

                     long a;

                     char b[10];

              };

              int main(void)

              {

                     Int i = red;

                     return i;

              }

             

              // a.cpp

              typedef int Int;         //a.cpp中重声明一个int类型别名,在连接时不会发生错误

              enum Color{blue};   //a.cpp中重定义了一个enum Color,在连接时不会发生错误

              const Int i =blue;                    //const常量定义,内部连接

              union X                                 //union定义,内部连接

              {

                     long a;

                     char b[10];

              };

       b)名字空间中静态自由函数、静态友元函数、静态变量、const常量定义有内部连接

             

              // main.cpp

              namespace test

              {

                     int foo();                             //函数声明,内部连接

                     static int i = 0;                         //名字空间静态变量定义,内部连接

                     static int foo() { return 0;}       //名字空间静态函数定义,内部连接

              }

              static int i = 0;                              //全局静态变量定义,内部连接

              static int foo() {return 1;}          //全局静态函数定义,内部连接

              const int k = 0;                      //全局const常量定义,内部连接

              int main(void)

              {

                     return 0;

              }

             

              //a.cpp

              namespace test

              {

                     int i = 0;                              //名字空间变量定义,外部连接

                     int foo() {return 0;}                   //名字空间函数定义,外部连接

              }

              int i = 0;                                       //全局变量定义,外部连接

              int k = 0;                                       //全局变量定义,外部连接

              int foo() { return 2;}                     //全局函数定义,外部连接

             

在全局名字空间中,main.cpp中定义了静态变量i,常量k,及静态自由函数foo等,这些都有内部连接。如果你将这些变量或函数的static或是const修饰符去掉,在连接时就会现multiply defined symbols错误,它们与a.cpp中的全局变量、全局函数发生冲突。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++,可以使用Windows API的WLAN API来获取已连接Wi-Fi的名称和信号强度。以下是一个简单的C++代码示例,可以实现此功能: ```c++ #include <Windows.h> #include <Wlanapi.h> #include <iostream> #pragma comment(lib, "Wlanapi.lib") int main() { // 初始化WLAN API DWORD dwError = 0; HANDLE hClient = NULL; DWORD dwMaxClient = 2; // 最大客户端数量 DWORD dwCurVersion = 0; if (WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient) != ERROR_SUCCESS) { std::cout << "WLAN API初始化失败!" << std::endl; return 1; } // 获取已连接Wi-Fi的名称和信号强度 PWLAN_INTERFACE_INFO_LIST pIfList = NULL; PWLAN_INTERFACE_INFO pIfInfo = NULL; PWLAN_CONNECTION_ATTRIBUTES pConnectInfo = NULL; if (WlanEnumInterfaces(hClient, NULL, &pIfList) != ERROR_SUCCESS) { std::cout << "获取网络接口信息失败!" << std::endl; WlanCloseHandle(hClient, NULL); return 1; } pIfInfo = &pIfList->InterfaceInfo[0]; if (WlanQueryInterface(hClient, &pIfInfo->InterfaceGuid, wlan_intf_opcode_current_connection, NULL, (DWORD*)&pConnectInfo, NULL) != ERROR_SUCCESS) { std::cout << "获取连接信息失败!" << std::endl; WlanFreeMemory(pIfList); WlanCloseHandle(hClient, NULL); return 1; } std::cout << "已连接Wi-Fi名称:" << pConnectInfo->strProfileName << std::endl; std::cout << "已连接Wi-Fi信号强度:" << pConnectInfo->wlanSignalQuality << std::endl; // 释放资源 WlanFreeMemory(pConnectInfo); WlanFreeMemory(pIfList); WlanCloseHandle(hClient, NULL); return 0; } ``` 以上代码可以获取已连接Wi-Fi的名称和信号强度,并在控制台上显示出来。如果要获取可用Wi-Fi的名称和信号强度,可以使用WlanScan函数扫描可用的网络,并使用WlanGetAvailableNetworkList函数获取可用网络列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值