C 泛型程式設計 編譯期錯誤檢測

2021-06-09 00:36:15 字數 1789 閱讀 6301

泛型程式設計如果需要在各個平台上進行移植,並且保證不讓移植的**出現潛在的錯誤,我們需要採用編譯期錯誤檢測而不是執行期的錯誤檢測。隨著泛型程式設計在c++中廣泛運用,更好的靜態檢驗以及更好的可定製型錯誤訊息的需求浮現了出來。

例子:如下安全轉型的函式

templateto safe_reinterpret_cast(from from)

如果呼叫:

int i=3;

char *p=safe_reinterpret_cast(i);

將產生乙個執行期的assertion.我們希望在編譯期就能檢測這種錯誤。主要是因為轉型動作可能是你的程式中偶爾執行的分支,當你的程式移植到另乙個編譯器或平台時,你可能會忘記每乙個潛在的不可移植部分(reinterpret_cast不可移植)。
我們可以使用下面的方法來進行編譯期的錯誤檢測,並可以進行錯誤訊息定製,範例如下:

templatestruct compiletimechecker

;template<> struct compiletimechecker;

#define static_check(expr,msg) \

;(void)sizeof(compiletimechecker<(expr)>(error_##msg()));\ //##是c++中罕被使用的操作符

}

假設sizeof(char)to safe_reinterpret_cast(from from)

void *somepointer=...;

char c=safe_reinterpret_cast(somepointer);

這段程式呼叫展開即定義了乙個名為error_destination_type_too_narrow的local>

乙個型別為error_destination_type_too_narrow的暫時物件加以初始化。最終sizeof會測量這個物件的大小。

compiletimechecker這個特體化有乙個可接受任何引數的建構函式;當expr為true時,這段**有效;當expr為false,就會有編譯期錯誤發生,因為編譯器找不到將error_destination_type_too_narrow轉成compiletimechecker的方法,還能給出正確的錯誤訊息。

例項:編譯期間檢查錯誤

checker.h

namespace xiaoding;}

#define static_check(expr, msg) do \

while(0)

main.cpp

#include"checker.h"

#includeint main()

編譯出現如下錯誤:

1>正在編譯...

1>main.cpp

1>f:\learning\pojects\compiletimechecker\compiletimechecker\main.cpp(8) : error c2079: 「error_destination_type_too_narrow」使用未定義的 struct「xiaoding::compiletimeerror<__formal>」

1>        with

1>        [

1>            __formal=0

1>        ]

c 泛型程式設計

對於兩個不同的概念a和b,如果概念a所需求的所有功能也是概念b所需求的功能,那麼就說概念b是概念a的子概念。例如 標準模板庫 standard template library,簡稱stl 提供了一些非常常用的資料結構和演算法 將函式物件作為演算法的引數而不是將函式所執行的運算作為演算法的一部分。使...

C 泛型程式設計

1.模板介紹 泛型程式設計 指的是直接應用 使用模板編寫好的函式模板或類模板庫程式 進行程式設計。在具體使用時,程式設計師只需向使用的庫函式或類模板提供型別或值即可。模板是泛型程式設計的基礎。比如使用標準模板庫中的容器 迭代器進行程式設計,就是泛型程式設計。模板函式 模板函式 強調的是函式,函式使用...

C語言泛型程式設計 泛型氣泡排序

在實際程式設計中,常常會需要一些方法 函式 比如排序,它們具體實現基本一致,僅僅只有引數型別不同,那麼可不可以有一種通用的函式,不管是什麼型別的引數都可以通用呢?泛型程式設計 泛型即是指具有在多種資料型別上皆可操作的含義,與模板有些相似。利用泛型程式設計,我們可以寫一些通用的函式,以減少 量,實現 ...