標籤:

【源碼眾讀】之每日問答,Day1

昨天整理了json11頭文件中自己看不懂的那些代碼

json11/hpp文件中的問題

接下來就一個一個的解決掉!!!

今天早上在朋友圈發了兩個問題,想必參與活動的小夥伴應該都看到了。

現在就來公布我的解答,不一定是標準答案,歡迎大家一起討論、指正。

問題1

#pragma oncen

疑問

這個宏相當於頭文件保護?完全等價嗎?

解題思路

百度

解答

  • #pragma once是編譯器相關的,有的編譯器支持,有的編譯器不支持
  • #ifndef,#define,#endif是C/C++語言中的宏定義,通過宏定義避免文件多次編譯。所以在所有支持C++語言的編譯器上都是有效的,如果寫的程序要跨平台,最好使用這種方式。

參考資料

#pragma once_百度百科

問題2

#ifdef _MSC_VER n #if _MSC_VER <= 1800 // VS 2013 n #ifndef noexcept n #define noexcept throw() n #endif nn #ifndef snprintf n #define snprintf _snprintf_s n #endif n #endif n#endifn

疑問

這裡的define有什麼用途?

解題思路

首先需要弄明白noexcept的用途,嘗試在c++ Primer中找到相關章節

  1. 翻目錄,沒找到
  2. 翻目錄後的c++11的新特性
    • 13.6.2 移動構造函數通常應該是noexcept
    • 18.1.4 noexpect異常指示符
    • 18.1.4 noexpect運算符

P690可以解答我們的疑問

解答

noexpect說明,用於告訴用戶和編譯器這個函數不會拋出異常

  • 用戶知道這個信息有助於簡化調用該函數的代碼
  • 編譯器知道這個信息能執行某些特殊的優化操作

noexcept緊跟在函數的參數列表後面,用以標識該函數不會拋出異常

如果對函數進行了noexpect說明,卻在函數內部執行throw語句或調用可能拋出異常的函數,程序會終止執行以確保遵守不在運行時拋出異常的承諾

noexpect說明符接受一個可選的實參,該實參必須能轉換為bool類型

void recoup(int) noexpect(true); nvoid alloc(int) noexpect(false);n

實參為true時指明函數不會拋出異常,為false時則可能拋出異常。看上去有點多此一舉,不帶參也能完成說明,那為什麼要支持帶參呢?

猜想應該是支持表達式的

果然,還提供了noexpect運算符。

noexpect(e)n

如果e調用的所有函數都進行了noexpect說明且e本身不含有throw語句時,返回true

void f() noexpect(noexpect(g()));n

後面一個noexpect運算符的返回值作為前一個noexpect說明符的實參

回到問題本身,很容易看出vs2013之前的版本可能沒有定義noexpect。因此這裡的define使用等價語句throw()來解決這個問題

同樣的,如果沒有定義snprintf,就使用_snprintf_s來替代

那麼snprintf是什麼意思呢?

  • 照舊去書上找找看,沒找到。
  • cppreference是第二選擇

cplusplus.com/reference

可以看到,snprintf也是c++11提供的一個方法,定義在頭文件<cstdio>中

int snprintf ( char * s, size_t n, const char * format, ... );n

它的作用就是:Write formatted output to sized buffer

將格式化的輸出寫入到指定大小的內存中

s用於緩存輸出的內存

n指定最大允許使用s中多大的內存,超出的文本會被丟棄

format是帶格式的文本

示例:

char buffer [100]; nint cx; ncx = snprintf ( buffer, 100, "The half of %d is %d", 60, 60/2 );n

format中包含多少個格式化字元,後面就需要跟多少個表達式

返回值是本次輸出共使用了多少內存

PS: 如果有書介紹這部分內容歡迎指出。

參考資料

  • 《c++ primer(第五版)》 P690

  • cplusplus.com/reference

推薦閱讀:

基於現代C++的四則運算語法分析器(上)
【源碼眾讀】之問題解答,Part_8
《C++ Primer》讀書筆記-第十二章 03 使用標準庫 part2
《C++ Primer》讀書筆記-第七章 04 類的作用域
我的CUDA學習之旅2——圖像形態學腐蝕、膨脹CUDA實現

TAG:C |