學習STL源碼遇到的C++新知識(一)

1.#pragma pack

設置字節對齊係數 ,用法如下


#pragma pack(push, length)//保存原來對齊大小,並設置對齊大小,length是一個正整數一般爲2^n
 
class....{
}
 
#pragma pack(pop) //恢復原本對齊大小

具體用法寫在了這篇博客:https://blog.csdn.net/qq_40238526/article/details/103000349

2.deprecated

語法

  1. [[deprecated]]
  2. [[deprecated( 字符字面量 )]]

解釋

下列名字或實體的聲明中允許使用這個屬性:

  •     class / struct / union:struct [[deprecated]] S; 
  •     typedef 名,也包括別名聲明:[[deprecated]] typedef S* PS; 、using PS [[deprecated]] = S * ; ,
  •     變量,包括靜態數據成員:[[deprecated]] int x; ,
  •     非靜態數據成員:union U { [[deprecated]] int n; }; ,
  •     函數:[[deprecated]] void f(); ,
  •     命名空間:namespace [[deprecated]] NS { int x; },
  •     枚舉:enum [[deprecated]] E {}; ,
  •     枚舉項:enum { A [[deprecated]], B [[deprecated]] = 42 }; ,
  •     模板特化:template<> struct [[deprecated]] X<int> {}; 。

指示允許使用聲明有此屬性的名稱或實體,但因故不鼓勵使用。編譯器通常會對其使用情況發出警告。若指定了 字符字面量,則它通常被包含於警告中。

以上內容來自:https://zh.cppreference.com/w/cpp/language/attributes/deprecated

由於沒有示例,在此自己編寫了一個例子,如下:

#include <iostream>
using namespace std;
struct[[deprecated("已經棄用")]] S{

};
int main()
{
	S s;
}

 運行結果如下:

來自:https://docs.microsoft.com/zh-cn/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(C4996)%26rd%3Dtrue&view=vs-2019 的解釋. 

 

所以在使用STL array的時候,如果你用了assign會報錯的原因

 #define _DEPRECATE_TR1_NAMESPACE	[[deprecated("warning STL4002: " \
	"The non-Standard std::tr1 namespace and TR1-only machinery are deprecated and will be REMOVED. You can " \
	"define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING to acknowledge that you have received this warning.")]]

 

#pragma push_macro

語法

#pragma push_macro("宏定義名稱")
#undef 宏定義名稱
 //do something...
#pragma pop_macro("宏定義名稱")

 解釋

取消宏定義,並將宏定義壓入棧,最後通過pop彈出宏定義

例子

不報錯。

使用push_macro將INT壓入棧保存,使它失去原來的宏定義

 報錯。

使用pop_macro將INT彈出,恢復宏定義

不報錯

在STL中有以下定義

這個意思就是取消對new的宏定義,並恢復其原有定義,估計原本對new的定義進行了更改。例如

#define new new(_FILE)

 #pragma warning

#pragma warning允許有選擇性的修改編譯器的警告消息的行爲

#pragma warning( disable : 4507 34; once : 4385; error : 164 )


等價於:

 #pragma warning(disable:4507 34) // 不顯示4507 和34 號警告信息
 #pragma warning(once:4385) // 4385 號警告信息僅報告一次
 #pragma warning(error:164) // 把164 號警告信息作爲一個錯誤。


同時這個pragma warning 也支持如下格式:
 

   #pragma warning( push [ ,n ] )
   #pragma warning( pop )  //這裏n 代表一個警告等級(1---4)。
   #pragma warning( push )保存所有警告信息的現有的警告狀態。
   #pragma warning( push, n)保存所有警告信息的現有的警告狀態,並且把全局警告等級設定爲n。
   #pragma warning( pop )向棧中彈出最後一個警告信息,在入棧和出棧之間所作的一切改動取消。例如:
   #pragma warning( push )
   #pragma warning( disable : 4705 )
   #pragma warning( disable : 4706 )
   #pragma warning( disable : 4707 )
   //.......
   #pragma warning( pop )


在這段代碼的最後,重新保存所有的警告信息(包括4705,4706 和4707)。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章