语言/CPP {属性说明符,attribute(()),[[]]}
__attribute__(())
[[]]
和__attribute__
並不是完全對應的, 比如__attribute__(( constructor))
就不能寫成[[]]
;
__attribute__(( constructor))
不要把他理解為是: 在程序的最開始 執行了這個函數; 也就是 不要以為他是在運行時執行的;
vector<int> A;
__attribute__((constructor)) void Init(){
A.resize(11);
DE_(0);
}
這個函數裡的2個操作, 都是出錯的; (雖然在我的電腦上可以, 但在AcWing
上 是會報錯的), 分析下他為什麼會報錯?
cout
她是個對象, 但現在不是在運行時, 他是不能用來輸出的, 她會導致Segmentation Fault
, 即這個對象 還沒有開闢內存 也就是 她根本就不存在;
A.resize(11)
這個代碼 雖然不會報錯, 但他是沒效果的! 因為A
這個對象 根本就不存在;
所以, 最好還是不要使用這些高科技…
屬性說明符[[]]
之前GCC是__attibute__((xxx))
MSVC是__declspec(xxx)
, 現在統一的語法的是[[xxx]]
;
@DELI;
[[noreturn]] 函數F
, 表明這個函數不會返回 (跟返回值沒有關係) 意思是要麼程序就一直在這個函數裡執行 要麼在這個函數裡會exit
退出;
比如[[noreturn]] int F(){ exit(0); return 123;}
這是可以的, 假如你不寫這個exit
程序會報錯! 這是對彙編層面的優化 對於int main(){ F(); return 1;}
, 他的彙編裡 不會出現return 1;
即彙編的最後一行代碼是call F()
所以你要保證F()
接管你整個程序;
@DELI;
[[deprecated]] 函數F
(可以加注釋[[deprecated("xxx")]]
), 當你調用這個函數時 編譯器會給出警告;
@DELI;
[[nodiscard]] int F(){ return 1;}
, 此時代碼F()
會被警告 應該寫成auto ret = F()
;
@DELI;
int a;
此時會被警告unused
, 可以寫成int a [[maybe_unused]];
來消除這個警告;