深化了解-C-探求-的新畛域-static关键字和外围言语个性测试宏-20 (深化了解是病句吗?)
static关键字
(1)static的多种用途
在C++中,static关键字有几种看似有关的用途。为该关键字过载局部动机是为了防止在言语中引入新的关键字。
(2)static数据成员和方法
你可以申明类的static数据成员和方法。与非静态数据成员不同,static数据成员不是每个对象的一局部。相反,数据成员的只要一份正本,存在于该类的任何对象之外。static方法雷同处于类级别而不是对象级别。static方法不在特定对象的高低文中口头;因此,它没有隐式的this指针。这也象征着static方法不能被标志为const。
static链接
(1)链接的概念
在触及static关键字用于链接之前,须要了解C++中链接的概念。C++源文件是独立编译的,编译后的对象文件被链接在一同。
C++源文件中的每个称号(包含函数和全局变量)都有一个链接性,可以是外部的(external)或外部的(internal)。外部链接象征着该称号可以从其余源文件访问。外部链接(也称为静态链接)则象征着无法以。自动状况下,函数和全局变量具备外部链接。但是,可以经过在申明前加上static关键字来指定外部(或静态)链接。
例如,假定有两个源文件:FirstFile.cpp和AnotherFile.cpp。这是FirstFile.cpp的内容:
voidf();intmn(){f();}
这个文件为f()提供了一个原型,但没有显示定义。而这是AnotherFile.cpp:
import<tream>;voidf();voidf(){std::cout<<"fn";}
这个文件为f()提供了原型和定义。请留意,在两个不同的文件中为同一函数编写原型是非法的。假设你将原型放在头文件中,而后在每个源文件中#include该头文件,这正是预处置器为你做的事件。
每个源文件都能无失误地编译,并且程序链接反常:由于f具备外部链接,main()可以从不同的文件调用它。但是,假定你在AnotherFile.cpp中的f()原型上运行static。
请留意,你不须要在f()定义前重复static关键字。只需它出如今函数称号的第一个实例之前,就无需重复。
import<iostream>;staticvoidf();voidf(){std::cout<<"fn";}
如今每个源文件依然可以无失误地编译,但链接步骤失败,由于f()具备外部(静态)链接,使其无法从FirstFile.cpp访问。某些编译器在静态方法被定义但未在该源文件中经常使用时会收回正告(暗示它们不应该是静态的,由于它们或许在其余中央经常使用)。
(2)经常使用匿名命名空间
用于外部链接的static的代替方法是经常使用匿名命名空间。与其将变量或函数标志为static,不如将其包装在一个无名命名空间中,如下所示:
import<iostream>;namespace{voidf();voidf(){std::cout<<"fn";}}
匿名命名空间中的实体可以在同一源文件中其申明之后的任何中央访问,但不能从其余源文件访问。这些语义与经常使用static关键字取得的语义相反。
正告:为了取得外部链接,倡导经常使用匿名命名空间,而不是static关键字。
拓展内容:外围言语个性的个性测试宏
C++20增加了个性测试宏,这些宏可用于检测编译器支持哪些外围言语个性。一切这些宏都以__cpp_或__has_cpp_扫尾。以下是一些示例:
留意:除非你正在编写十分通用的跨平台和跨编译器库,否则你很少须要这些个性测试宏。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。