Visual Studio 2022 17.14

| | 0 Comments| 13:14|
Categories:

Visual Studio 2022 推出 2025 第二次次版號更新、更新到 17.14 了。官方的公告是《Visual Studio 2022 v17.14 is now generally available!》、這次更新的重點還是 GitHub Copilot、主要是加入了 agent、MCP、NES(Next Edit Suggestion)等功能的支援。

在 C++ 的部分,則有一些編譯器語法支援的改進,以及個人覺得滿有趣的「C++ Dynamic Debugging」;這部分的更新紀錄,則可以參考《What’s New for C++ Developers in Visual Studio 2022 17.14》。

完整的更新紀錄可以參考官方的 release note(連結)。下面則是 Heresy 自己的一些紀錄。


GitHub Copilot

這部分感覺也算是微軟現在的主力了,所以更新的項目還不少。

首先,兩個新的預覽功能分別是「Copilot agent 模式」以及「支援 MCP 伺服器」。

這部分官方有一篇《Agent mode has arrived in preview for Visual Studio》在做介紹,基本上就是可以透過 GitHub Copilot 聊天的視窗、直接用自然語言要求他去做事情、而不再只是回答問題。官方號稱他可以:

  • 自動去找到相關的內容、並進行編輯
  • 提供建議的終端機命令、讓使用者決定是否要接受並執行
  • 透過 MCP 伺服器執行可信任的工具

由於 MCP(Model Context Protocol)是一個開放的通訊協議,所以技術上應該可以串接自己的 MCP 服務、來完成更多的工作。不過目前好像沒看到 Visual Studio 有提供 MCP 相關的設定?

其他的功能包括了:

  • 加入了基於 GPT-4o mini 的「GPT-4o Copilot code completion」這個新模型。

  • 自動產生註解。在函式前輸入「///」(會根據設定而不同),預設會根據函式介面產生註解的範本;等一段時間後,他會透過 AI 產生建議的註解內容。

  • 下一個編輯建議(Next Edit Suggestion、NES)。在修改程式後,他會根據當下的修改,去預測接下來可能要修改的地方。

  • 調適型貼上(Adaptive paste)。在貼上程式碼後,會去分析內容、提供貼上內容的修改建議。

另外,現在 GitHub Copilot 似乎也打算提供比較明確的用量統計了?現在點選「Copilot Consumptions」後,會出來目前計畫的限制更新日期、以及使用比例;不過,感覺好像沒有即時更新使用量?

 

不過老實說,由於 Heresy 的 GitHub Copilot 是免費版、可用量其實很少,所以就沒認真在玩這一部分的功能就是了。


延伸模組可排除自動更新

現在延伸模組可以針對個別項目設定是否要自動更新了。

在已經安裝的延伸模組的頁面,點選右邊的齒輪就可以控制這個延伸模組是否要自動更新。

而在設定介面裡面,也可以看到目前的自動更新設定、以及被排除的名單,方便管理。

有這樣的設定對於碰到某些延伸模組升級到新版會出問題的時候是很方便的。


C++ 動態偵錯

新加入的預覽功能,它的目的是讓 Visual Studio 可以針對最佳化過的程式(通常是 release)進行偵錯!這部分的介紹可以參考《C++ Dynamic Debugging: Full Debuggability for Optimized Builds》。

要使用這項功能需要針對個別 C++ 專案設定是否要啟用;設定選項是專案屬性中的「進階」內的「使用 C++ 動態偵錯」,在設定成「是」之後,需要重新編譯。

在啟用後,就可以設定中斷點、針對 release 版程式進行偵錯了~而其他像是逐行執行、觀察變數等等,也都可以使用。

不過 Heresy 這邊的大型專案在開啟這個選項後會在連結階段出現錯誤,可能還要再研究一下該怎麼改設定了。


C++ 23 語法更新

在《C++ Language Updates in MSVC in Visual Studio 2022 17.14》這篇有提到,這次有再針對 C++23 的語法提供新的支援。

包括了:

lambda

在 lambda 沒有參數的時候、可以省略 ()P1102R2),例如:

auto f = [] {};

此外,現在 lambda 也可以指定 attribute(P2173R1),例如:

auto f = [] [[nodiscard]] { return new int[10]; };
f(); //warning

這邊因為有標記 [[nodiscard]]參考),所以在呼叫的時候如果沒有去接它回傳的變數,編譯器就會發出警告。

if consteval(P1938R3

透過這個新的條件判斷方式,可以讓一個 constexpr 的函式針對編譯階段、執行階段做不同的處理。例如:

constexpr bool test()
{
  if consteval // if (std::is_constant_evaluated())
  {
    return true;  // compile time
  }
  else
  {
    return false;  // runtime
  }
}

不過這件事在 C++ 20 也可以透過 std::is_constant_evaluated()參考)來做就是了。

static operator () []

允許類別定義靜態版本的 operator()P1169R4)和 operator[]P2589R1);理論上在符合的情境下,使用 static 的版本是可以提高效能的。

例如一個類別可以寫成:

class CTest
{
public:
  static int operator()()
  {
    return sizeof(aData);
  }
 
  static int operator[](const size_t idx)
  {
    return aData[idx];
  }
 
protected:
  inline static int aData[] = {1,2,3};
};

不過,如果不透過物件要呼叫的時候其實有點麻煩,得寫成:

int a = CTest::operator()();
int b = CTest::operator[](1);

個人覺得有用/有趣的主要大概就是這樣了?之後有注意到別的東西就在另外補充吧。

Leave a Reply

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