当前位置:首页 > 数码 > 深化了解-C-探求-的新畛域-static关键字和外围言语个性测试宏-20 (深化了解是病句吗?)

深化了解-C-探求-的新畛域-static关键字和外围言语个性测试宏-20 (深化了解是病句吗?)

admin7个月前 (05-13)数码31

static关键字

(1)static的多种用途

在C++中,static关键字有几种看似有关的用途。为该关键字过载局部动机是为了防止在言语中引入新的关键字。

(2)static数据成员和方法

20

你可以申明类的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_扫尾。以下是一些示例:

留意:除非你正在编写十分通用的跨平台和跨编译器库,否则你很少须要这些个性测试宏。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: C

“深化了解-C-探求-的新畛域-static关键字和外围言语个性测试宏-20 (深化了解是病句吗?)” 的相关文章

深化剖析-atomic-代码范例和实践运行-std-现代-中的原子-C (深化剖析整改)

深化剖析-atomic-代码范例和实践运行-std-现代-中的原子-C (深化剖析整改)

一、引言 在并发编程中,原子操作是一种无法终止的操作,即在多线程环境中,一旦开局就不会被其余线程搅扰。C++11引入了std::atomic库以支持原子操作,为并发编程提供了更为方便和高效的...

编程实践-哈希负载均衡算法-IP-C (编程实践心得体会)

编程实践-哈希负载均衡算法-IP-C (编程实践心得体会)

Nginx 是一个高性能的开源 Web 服务器和反向代理服务器,因其高效处理高并发的请求而闻名。以下是一些 Nginx 用于处理高并发的主要特点和技术: 事件驱动架构: Nginx 使...

提升性能的新利器-17中的并行功能-C (提升 性能)

提升性能的新利器-17中的并行功能-C (提升 性能)

C++17扩展了STL(Standard Template Library,标准模板库)以支持并行算法。这意味着许多常见的算法,如std::sort、std::for_each、std::tran...

开源项目-助初学者进阶成长-C-八个 (开源项目有什么用)

开源项目-助初学者进阶成长-C-八个 (开源项目有什么用)

通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。 ThreadPool 一个简单...

让新手也能轻松把握-C-类模板特化与承袭经常使用指南 (请问新手)

让新手也能轻松把握-C-类模板特化与承袭经常使用指南 (请问新手)

一、类模板特化 1.特化的成功 你可以为特定类型提供类模板的替代成功。例如,你或许以为constchar类型(C格调字符串)的Grid行为没无心义。Grid<constchar&...

了解圈套和无效经常使用技巧-言语变长参数-C (了解圈套和无线的区别)

了解圈套和无效经常使用技巧-言语变长参数-C (了解圈套和无线的区别)

C工具 变长参数列表 这局部解释了旧的C格调变长参数列表。了解这些内容很关键,由于你或许会在遗留代码中遇到它们。但是,在新代码中,你应该经常使用变参模板来成功类型安保的变长参数列表。...

的区别-中-C-math.h-和-cmath (的区别中的钱)

的区别-中-C-math.h-和-cmath (的区别中的钱)

一、引言 C++规范库中的<cmath>和C言语规范库中的<math.h>均为数学函数库,它们提供了一系列数学函数和常量。但是,这两者之间存在一些关键的区别...

监禁程序后劲的优化利器-C-中的内联函数 (监禁等于坐牢吗)

监禁程序后劲的优化利器-C-中的内联函数 (监禁等于坐牢吗)

一、内联函数的定义和特点 内联函数是一种不凡的函数,它经过在编译时将函数调用交流为函数体中的代码,以缩小函数调用的开支,从而提高程序的口头效率。内联函数通罕用于那些函数体较小、调用频繁的场景...