语言/CPP {属性说明符,[[]],__attribute__(())}

语言/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]];來消除這個警告;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值