Visual Studio 2022 應該是今年最後一次更新、17.8 推出囉~
官方的公告是《Visual Studio 17.8 now available!》,和 C++ 相關的部分則可以參考《What’s New for C++ Developers in Visual Studio 2022 17.8》。
而這次更新比較特別的,是他還用比較特別的介面要求重新登入?不知道是不是有修改內部的登入機制?
而在應用程式中的「新增功能」頁面中特別列出的新功能如下:
- 比較和差異的摘要檢視
- 效能增強
- C++ Build Insights 函式檢視
- Unreal Engine 程式碼片段
- Unreal Engine 測試配接器
- Unreal Engine 反映巨集指定名稱建議
- 大小寫保留尋找和取代
- 偵錯案例中的 .NET 計數器工具
- 快速諮詢內的類別、結構和等位的大小和對齊方式。
- 透過附加至處理序對 Linux App Services 進行偵錯
- 透過計量 API 對新儀器的 .NET 計數器支援
- BenchmarkDotNet IDiagnosers
- 中斷點設定視窗的增強主題支援
- 將成員函式設為 Const
- 將全域函式設為靜態
- 排序 #include 指示詞
- 結構化診斷
老樣子,Heresy 這邊還是舊址針對自己有興趣的東西來稍微介紹、紀錄一下了。
結構化診斷(Structured Diagnostics)
這項新功能算是這次的新功能裡面 Heresy 最期待的東西了~他主要是針對編譯錯誤的訊息再做調整、讓錯誤訊息更結構化、更好理解。
假設我們有一段程式碼如下:
#include <concepts> #include <vector> #include <array> void test(std::vector<float>) {} void test(std::array<float,3>) {} template<std::integral T> void test(T){} int main() { test(0.2); }
這邊有三個需要不同型別引數的 test()
函式,而在乎叫的時候,由於引述型別是浮點數,所以會因為沒有沒有符合的方法而建置失敗。
在舊版的 Visual C++,他的錯誤清單會是下面的訊息、還算明確:
但是當要認真看錯誤訊息的時候,應該會覺得他給的錯誤訊息相當雜亂、難以閱讀…
而更新到 17.8 之後,錯誤清單的部分雖然訊息一樣,但是最後面多了一個「詳細資料」的欄位。
點選詳細資料這一欄的圖示後,會開啟「問題詳細資料」的視窗,這邊會以可折疊的樹狀結構、來顯示錯誤的詳細訊息。
這樣的顯示方法,基本上會比本來要去錯誤輸出那邊看簡單很多;而且這邊去點選列出來的函式也會自動跳到對應的程式碼、方便確認。
不過錯誤訊息的部分…感覺好像變得更長了? o_O
但是由於在輸出內容和排版上有改進,所以應該還是比以前好閱讀就是了。
接下來,可能就是等到實務上更複雜的狀況的時候,才知道到底能不能幫助解決問題了。
官方的介紹可以參考《Structured Diagnostics in the New Problem Details Window》這篇。
快速檢視類別、結構的大小和對齊
這次另一個新功能,是在程式碼編輯器中、將滑鼠游標移動到型別上的時候,除了會顯示詳細的型別資訊外,還會顯示這個資料結構的大小、對齊。
對於比較高階的程式這個應該不算什麼重點,但是如果要處理比較底層的東西的時候,這些資訊有的時候會很重要。(官方說明)
#include 自動排序
個人覺得算是有點微妙的小功能。現在只要在 include 的位置按滑鼠右鍵,就可以透過點選「#include 指示詞」的「排序 #include 指示詞」來幫 include 的 header 根據字母順序、重新排列了。
而他排列的應該會是連續的 include、如果本來有透過空行分段的話則不會被一起排序。
另外,官方說明裡面雖然有提到 17.7 出現過的「#include 清除」功能(因為有問題後來在 17.7.3 被回收了),但是這邊在選項裡面並沒有看到對應的東西有回來?
幫全域函式加上 static
這次更新後,Visual Studio 也會建議將沒有 forward declaration 的全域函式(global function)改成靜態(static)的。
將滑鼠游標移到符合條件的全域函式上,他就會提示這個函式可以設為靜態:
點選前面的螺絲起子圖示後,就會有「將此函式設為靜態」的選項了:
會這樣建議主要是確保這個靜態全域函式只允許自己這個 translation unit 裡面存取,可以用來避免衝突。
一個比較簡單的例子,就是如果一個程式裡面有多個 .cpp
的檔案的話,假設有兩個檔案裏面都有定義 void test(float){}
這個函式的話,那雖然在個別編譯的時候不會有問題,到了連結(linking)階段,就會出現重複定義的問題。
而如果幫改成 static void test(float) {}
的話,則可以解決這樣的問題,但是相對地在別的檔案裡面,就沒辦法使用這個函式了。即便加上 forward declaration,在連結階段也會找不到可以用的參考。
這邊可以參考《Make Member Function const and Global Function Static in Visual Studio》。
幫成員函式設定成 const
這個功能主要是會去偵測類別的成員函式,如果函式的內容沒有修改到類別本身的內容的話,那他就會建議你加上 const;一方面是增加可使用的範圍、再來也可以避免以後修改不小心改到類別的成員。
例如下面這樣的程式:
class CTest { public: int getVal() { return iVal; } public: int iVal = 0; };
由於 getVal()
就單純是取值而已,所以當滑鼠游標移過去的時候,Visual Studio 就會建議說他可以設為 const:
而點選前方燈泡的圖示,就會出現「將成員設為 const」的選項:
這邊比較有趣的,他還有變動的預覽。
而如果定義和實作是分開的時候,他的提示會出現在實作的地方;預覽會兩個都顯示、也會兩邊同時修改。
而如果是把實作獨立在另一個檔案的時候(通常是 .h + .cpp 這樣的情境),他會變成下面有一個「預覽所有變更的檔案」的連結,點下去就可以看到所有受影響的檔案內容了。
基本上,個人覺得也還算實用啦。
程式碼對比的摘要模式
在這個版本的檔案比對、或是檢視 Git 不同版本的差異比較的時候,在差異比較的視窗右上角、多了一個「摘要」的按鈕,透過這個按鈕,可以切換成「摘要顯示」的模式。
這個模式會強調有變化的部分、僅顯示有修改的部分與前後一點,其他沒有變化的部分會把它收折起來;像是下圖中「xxx 條隱藏行」,就是沒有變化、被收折起來的部分。
這樣的設計可以讓有變化的部分更為明顯,而如果要看其他部分,也可以很簡單地展開來看。(官方說明)
文字取代時保留大小寫(官方說明)
這項功能,是在取代的時候,可以選擇保有原來的大小寫設定。老實說,個人覺得這功能有點微妙…
假設程式裡面有:
int main() { int testName = 0; int TestName = 0; int testname = 0; }
如果想把「test name」改成「my variable」的同時、又想保持原來的大小寫設定的話,那可以在進行取代(Ctrl + H)的時候,把「保留大小寫」選起來:
這樣取代完的結果會變成:
int main() { int myVariable = 0; int MyVariable = 0; int myvariable = 0; }
老實說,個人真的不知道這功能要拿來幹嘛…
CMake 專案的目標檢視改進
這部份過去 Heresy 一直都沒什麼在碰,不過最近因為想要用 Visual Studio 來對 Linux 的程式 debug,所以有稍微研究一下。
而這次的改進,主要可以參考《Enhancing the CMake Targets View in Visual Studio》;看來主要是簡化切換到目標檢視的方法,同時也允許從檢視裡面排除特定的項目。
這篇大概就這樣了。其他的功能,就請參考官方部落格文章或是 release note 吧~