GitHub - jroelofs/calc: Toy Calculator
Toy Calculator
1,拿到一個project,第一眼看,沒有配置文件,說明沒有引入持續集成系統,continuous integration system。
2,然后看cmake文件,使用的子文件夾、編譯標準、Unit Test、要編譯的Target。
3,項目的clean命令。
4,先看測試功能的部分。
5,包含項目內的頭文件時,使用的是相對路徑。便于代碼移植。
6,使用了gtest框架。
7,使用fuzz testing,在分析用戶提供的輸入功能時使用。(libFuzzer工具)。用戶通過某個input Entry point來提供各種隨機數據。
8,使用if語句,需要大括號,curly brace。單行語句時,
9,Team work時,你提交的代碼,創建的pull request,有別人幫忙review,如果自己一個人的話,也最好遵循這個流程。就是自己給自己Review,然后再Merge。
10,如果析構函數為空,可以設置:virtual ~Lexer( ) = default;
11,可以刪除copy構造函數。Lexer &operator=(const Lexer &) = delete;
12,還有Lexer(const Lexer &) = delete;? 因為不需要,還會在多態時引起不必要隱患。
13,use powerline shell for bash
14,可以實用線上編譯, Compiler Explorer?
15,sliced: 一個全新創建的對象,只從派生類取得一部分內容,別的可以用到多態的內容就不要了。在構造或賦值時發生。
16,父類刪除了copy constructor, move constructor,? copy assignment,?move assignment,子類中也會自動刪除。
17,父類析構函數是virtual的,那子類的析構函數也自動就是virtual。
18,rule of zero is to avoid defining any special member function.? 不想有任何的copy構造函數、copy assignment、move assignment、move構造以及虛析構函數等。
19,如果在一個項目里,使用pragma once,里面基本只是symlinks,你會很痛苦。
20,使用nvim編輯文件。
21,使用decltype( )?
22,just be consistent, 比如給類取命時,是Vector_Lexer還是VectorLexer,都可以保持統一即可。
23,類的成員定義,兩個變量還是放到兩行較好。
24,類的成員定義:? int Line{0};
25, [[nodiscard]] virtual bool empty( ) const = 0;? 表示我調用這個函數,但不使用這個函數的返回值,則表示這是一個bug。
如下所示,編譯時會報一個warning:
26,如上面函數,如果需要,就要加上const。還有前面加上constexpr (C++ 20).
[[nodiscard]] constexpr virtual bool empty( ) const = 0;
27,CMAKE_CXX_STANDARD is set C++ 17
28,? std::isspace( static_cast<unsigned char>? (c ) )
29,? GCC里有個__builtin_unreachable( ); , 用在switch case中。這樣影響移植。
30,如果switch case里有異常的case,可以實使用assert或者拋出異常。
參考:
1,Youtube C++ Weekly
https://www.youtube.com/watch?v=rFnRzW3vvsQ&list=PLs3KjaCtOwSYh2X7z0mxUbArhW1O4_4z1