Visual Studio 17.8

| | 0 Comments| 14:40
Categories:

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 吧~

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *