成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

探索 C++20 的新領域:深入理解 static 關鍵字和核心語言特性測試宏

開發 前端
在 C++ 中,static 關鍵字有幾種看似無關的用途。為該關鍵字“過載”部分動機是為了避免在語言中引入新的關鍵字。

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 的內容:

void f();
int main() {
    f();
}

這個文件為 f() 提供了一個原型,但沒有顯示定義。而這是 AnotherFile.cpp:

import <iostream>;
void f();
void f() {
    std::cout << "f\n";
}

這個文件為 f() 提供了原型和定義。請注意,在兩個不同的文件中為同一函數編寫原型是合法的。如果你將原型放在頭文件中,然后在每個源文件中 #include 該頭文件,這正是預處理器為你做的事情。

每個源文件都能無錯誤地編譯,并且程序鏈接正常:因為 f 具有外部鏈接,main() 可以從不同的文件調用它。然而,假設你在 AnotherFile.cpp 中的 f() 原型上應用 static。

請注意,你不需要在 f() 定義前重復 static 關鍵字。只要它出現在函數名稱的第一個實例之前,就無需重復。

import <iostream>;
static void f();
void f() {
    std::cout << "f\n";
}

現在每個源文件仍然可以無錯誤地編譯,但鏈接步驟失敗,因為 f() 具有內部(靜態)鏈接,使其無法從 FirstFile.cpp 訪問。某些編譯器在靜態方法被定義但未在該源文件中使用時會發出警告(暗示它們不應該是靜態的,因為它們可能在其他地方使用)。

(2) 使用匿名命名空間

用于內部鏈接的 static 的替代方法是使用匿名命名空間。與其將變量或函數標記為 static,不如將其包裝在一個無名命名空間中,如下所示:

import <iostream>;
namespace {
    void f();
    void f() {
        std::cout << "f\n";
    }
}

匿名命名空間中的實體可以在同一源文件中其聲明之后的任何地方訪問,但不能從其他源文件訪問。這些語義與使用 static 關鍵字獲得的語義相同。

警告:為了獲得內部鏈接,建議使用匿名命名空間,而不是 static 關鍵字。

拓展內容:核心語言特性的特性測試宏

C++20 添加了特性測試宏,這些宏可用于檢測編譯器支持哪些核心語言特性。所有這些宏都以 __cpp_ 或 __has_cpp_ 開頭。以下是一些示例:

  • __cpp_range_based_for
  • __cpp_binary_literals
  • __cpp_char8_t
  • __cpp_generic_lambdas
  • __cpp_consteval
  • __cpp_coroutines
  • __has_cpp_attribute(fallthrough)
  • 等等...

這些宏的值是一個數字,代表添加或更新特定特性的月份和年份,格式為 YYYYMM。例如,__has_cpp_attribute(nodiscard) 的值可以是 201603(即 2016 年 3 月,[[nodiscard]] 屬性首次引入的日期),或者是 201907(即 2019 年 7 月,屬性更新以允許指定原因,如 [[nodiscard("Reason")]])。

注意:除非你正在編寫非常通用的跨平臺和跨編譯器庫,否則你很少需要這些特性測試宏。

責任編輯:趙寧寧 來源: coding日記
相關推薦

2022-06-29 08:05:25

Volatile關鍵字類型

2024-02-26 10:36:59

C++開發關鍵字

2023-10-04 00:04:00

C++extern

2019-09-04 14:14:52

Java編程數據

2011-07-14 23:14:42

C++static

2023-11-15 15:54:17

C++運算符

2024-04-08 11:35:34

C++static關鍵字

2015-11-10 16:10:22

C語言StaticConst

2023-08-01 07:23:56

JSPweb

2023-09-24 13:58:20

C++1auto

2020-11-11 08:45:48

Java

2011-04-21 16:57:56

staticextern

2022-02-17 08:31:38

C語言staic關鍵字

2021-02-01 13:10:07

Staticc語言UNIX系統

2010-02-02 14:27:54

C++ static關

2022-01-10 18:11:42

C語言應用技巧

2024-04-07 00:04:00

Go語言Map

2016-05-24 15:55:01

大數據TalkingData

2012-03-01 12:50:03

Java

2011-03-02 12:33:00

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩成人免费视频 | 欧美无乱码久久久免费午夜一区 | 丝袜美腿一区二区三区动态图 | 久草www| 国产在线a| 99亚洲综合| 色吧久久| 不卡一二区 | 夜夜草 | 国产精品3区| 日韩中文字幕 | 欧美一区二区成人 | 国产视频观看 | 99这里只有精品 | 中文字幕欧美一区 | 激情五月婷婷丁香 | 成人三级在线播放 | 成人欧美在线 | 精品免费视频一区二区 | 99热这里| 欧美日韩国产精品激情在线播放 | 国产成人一区二区三区久久久 | 国产成人精品久久久 | 欧美激情一区二区 | av国产精品 | 精品久久久久久久久久久久 | 国产精品久久欧美久久一区 | 久久久精品一区二区三区 | 精品一区视频 | 成人欧美一区二区 | 国产成人午夜精品影院游乐网 | 欧美精品一二三 | 国产a级黄色录像 | 欧美精品日韩精品国产精品 | 国产精品久久久久无码av | 九九九视频精品 | 国产精品视频免费看 | 四虎永久免费黄色影片 | 免费一区二区三区 | 亚洲久草视频 | 二区中文|