【源碼眾讀】之每日問答,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中找到相關章節
- 翻目錄,沒找到
- 翻目錄後的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是第二選擇
http://www.cplusplus.com/reference/cstdio/snprintf/
可以看到,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
http://www.cplusplus.com/reference/cstdio/snprintf/
推薦閱讀:
※基於現代C++的四則運算語法分析器(上)
※【源碼眾讀】之問題解答,Part_8
※《C++ Primer》讀書筆記-第十二章 03 使用標準庫 part2
※《C++ Primer》讀書筆記-第七章 04 類的作用域
※我的CUDA學習之旅2——圖像形態學腐蝕、膨脹CUDA實現
TAG:C |
