1. 程式人生 > >C語言: 從 CodeBlocks 到 Microsoft Visual Studio 2017

C語言: 從 CodeBlocks 到 Microsoft Visual Studio 2017

from comm mem more class c語言 交互 cau auth

  開學到現在寒假,學習了一個學期的C語言,同時也已然用了大半年的 CodeBlocks 來寫 C/C++ 程序。CodeBlocks 是寫 C/C++ 語言的程序最輕量的IDE(集成開發環境),在 C 語言IDE中名聲也是不小的,整個體積包括編譯器 GUN 才70-80MB。筆者軟件專業教學所用的就是這個 CodeBlocks IDE,與之同樣有著輕量能級、名氣的 C/C++ 的IDE是 Dev C++ ,它為 CCF (China Computer Federation)中國計算機學會考試等級比賽指定IDE。我也是用過一下的,主要鑒於平時學習一直使用 CodeBlocks ,還有 Dev C++ 的交互界面不是很棒,有點掉檔次。

  用習慣了 CodeBlocks 就來嘗嘗鮮,玩起了 Microsoft Visual Studio 2017,本文就以個人體驗從 CodeBlocks 到 Microsoft Visual Studio 2017的小經歷來講述。Microsoft Visual Studio 微軟出品,聽說在自家的桌面級系統 Windows 下算是精品之作。

  且不評價,來看看 Microsoft Visual Studio吧。上 Visual Studio IDE 官網通過鏈接下載好 Microsoft Visual Stdio ,看到簡介 “豐富的IDE 高級調試” 很牛逼嘛。下載打開發現正如網上所說用它來寫 C 實在是小兒科了,這麽多東西對於新手來說真的有點無從下手呀,所以C語言新手還是推薦 CodeBlocks 、Dev C++等這些輕量級的IDE,還有 VC 6.0 就不要用這個東西了,用來過過二級就好。

  在 Microsoft Visual Studio 安裝的工作負載列表中看到


    Windows 欄下:通用Windows平臺開發、使用C++的桌面開發、.net桌面開發

    Web 和 雲 欄下:ASP.NET和Web開發、Python開發、Azure開發、Node.js開發、Office/SharePoint開發、數據存儲和處理、數據科學和分析應用程序

    移動與遊戲 欄下:使用.NET的移動開發、使用 Unity 的遊戲開發、使用JavaScript的移動開發、使用C++的移動開發

    其他工具集 欄下:Visual Stdio 擴展開發、使用C++的Linux開發、.NET Core跨平臺開發


  同時在單個組件的列表中,可以看到許多的組件可自選。語言列表中可以看到支持 波蘭語、朝鮮語、德語、俄語、法語、捷克語、葡萄牙語、日語、土耳其語、西班牙語、意大利語、英語、中文(簡體)、中文(繁體) 這14種語言

  功能眾多的,用來寫C真的是大材小用了。不過既然可以用來寫C妨來試試,在工作負載列表中選擇Windows欄下的通用Windows 平臺開發安裝就算是可能寫C項目了(不然一個都選擇,安裝好了就像是個框框沒有什麽內容),勾選此項之後可以看到右下角的總安裝大小達到了14G 左右!這安裝盤的剩余空間沒個20G怕是沒法安裝咯,而且目前才勾選了這一項,要全部勾選那可得準備50G的磁盤空間喲~這裏筆者只是寫寫C就勾選安裝這個14G左右的通用Windows平臺開發就好了,接下來就是慢慢等咯,大概也就不到一個小時吧。

  安裝好了,開始運行就要求登錄微軟賬戶,沒有可以去註冊。還有此軟件可不是免費產品,需要密鑰激活許可證。在菜單 幫助 > 註冊產品,輸入對應版本的密鑰進行註冊,以下僅給出了 Visual Studio 2017 企業版和專業版的密鑰,其它版本請自行百度啦。

Visual Studio 2017(VS2017) 企業版 Enterprise 註冊碼 key:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

Visual Studio 2017(VS2017) 專業版 Professional 激活碼 key:KBJFW-NXHK6-W4WJM-CRMQB-G3CDH

  好,完成以上步驟後。看到起始頁,有點慌,通過百度知道,文件>新建項目 在左側已安裝列表中可能看到之前安裝的 Winodws 通用平臺下的 Visual C++ > Windows 桌面 對應右側選擇 Windows 控制臺應用程序(也就是命令提示符窗口 圖標也是一個命令提示符窗口的樣式 C:\ ) 選擇後在下方設置好名稱、位置、解決方案名稱等就可能確定新建了。

  新建後的的.cpp文件中默認內容為(雖說.cpp是C++源文件的後綴,不過可以用來寫C的,當然可以在後續建立好項目的右側中的 解決方案資源管理器 的方案中源文件的修改和方案名相同的.cpp文件後綴名為 .c )

// C Test.cpp: 定義控制臺應用程序的入口點。
//

#include "stdafx.h"


int main()
{
  
return 0; }

   這個頭文件 stdafx.h 是啥? 它被稱之為 預編譯頭 ,如果不寫入此頭文件會出現 C1010 錯誤,在點擊帶有下劃線鏈接的錯誤代碼可以轉到網頁的詳情頁,此頁面描述了錯誤原因及如何關閉該錯誤。


查找預編譯頭時意外的文件尾。 是否忘記添加 #include 名稱對源?

使用指定的包含文件/Yu源文件中未列出。 默認情況下,在大多數 Visual c + + 項目類型中啟用了此選項,並且"stdafx.h"默認值包括此選項指定的文件。

在 Visual Studio 環境中,使用以下方法之一來解決此錯誤:

  • 如果你的項目中不使用預編譯標頭,設置創建/使用預編譯標頭屬性源文件復制到不使用預編譯頭若要設置此編譯器選項,請按照下列步驟:

    1. 在項目的解決方案資源管理器窗格中,右鍵單擊項目名稱,然後單擊屬性

    2. 在左窗格中,單擊C/c + +文件夾。

    3. 單擊預編譯標頭節點。

    4. 在右窗格中,單擊創建/使用預編譯標頭,然後單擊不使用預編譯頭

  • 請確保不要意外刪除、 重命名或刪除了標頭文件 (默認情況下,stdafx.h) 從當前項目。 此文件還需要在你使用的源文件中的任何其他代碼之前包含#include"stdafx.h"(此標頭文件指定為通過文件創建/使用 PCH項目屬


  這樣設置後,就可以不用再添加頭文件 stdafx.h 了。來寫個 Hello World 吧!

#include<stdio.h>
int main(void)
{
    printf("Hello World.\n");           
}

  選擇好菜單欄下方 解決方案配置 Debug/Release (關於兩者區別) 解決方案平臺 x86/x64 (兩者區別) 然後點擊 本地Windows調試器,就運行了。

  一閃而過,對此也很正常,程序執行完成就退出啦。這就和 CodeBlocks 就不同了,CodeBlocks 通過處理程序運行完成後會暫停。而 Microsoft Visual Studio 2017 則不同執行完成直接退出了,這就是為啥一閃而過。對此,


  可以在printf();語句後加上 system("pause"); 當然要記得加上頭文件 stdlib.h

  也可以在printf();語句後加上 getchar();

  還可以在 調試 菜單中選擇 開始執行(不調試),也可以按 Ctrl + F5

  或者我們可以在printf();下一行添加斷點,將光標移動到printf();的下一行右鍵 斷點>插入斷點,當然可以在行號之前的豎欄中點擊這樣就可以快速在當前行添加斷點


  以上方法根據自身情況去使用。

  還沒完呢,當你使用 scanf 這個標準輸入函數時會報錯 C4996

  scanf() 錯誤 C4996 ‘scanf‘: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
  關於此錯誤點擊錯誤代碼可以打開網頁查看詳情及解決方案:


編譯器遇到棄用聲明。The compiler encountered a deprecated declaration. 此警告始終是故意消息從庫或附帶的頭文件,不應在不了解後果的情況下使用不推薦使用的符號的作者。This warning is always a deliberate message from the author of the library or included header file that you should not use the deprecated symbol without understanding the consequences. 由棄用修飾符或在聲明的站點的屬性指定實際的警告消息。The actual warning message is specified by the deprecation modifier or attribute at the site of the declaration.

這些是生成的 C 運行庫和標準庫,但不是一個詳盡的列表的一些常見 C4996 消息。These are some common C4996 messages generated by the C Runtime Library and the Standard Library, but not an exhaustive list. 訪問下列鏈接或閱讀以獲取的方法可以解決此問題,或者若要關閉該警告。Follow the links or read on for ways to fix the issue or to turn the warning off.

  • 此項的 POSIX 名稱已棄用。請改用 ISO C 和 c + + 一致的名稱: new_name。請參閱聯機幫助了解詳細信息。The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new_name. See online help for details.

  • 此函數或變量可能不安全。請考慮使用safe_version相反。若要禁用棄用,請使用_CRT_SECURE_否_警告。請參閱聯機幫助了解詳細信息。This function or variable may be unsafe. Consider using safe_version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

  • std::function_name::_未選中_叠代器::_Deprecate 調用 std::function_name具有參數,參數可能不安全的此調用依賴於調用方檢查傳遞的值正確。若要禁用此警告,請使用 -D_SCL_SECURE_NO_WARNINGS。有關如何使用 Visual c + + 檢查叠代器,請參閱文檔‘std::function_name::_Unchecked_iterators::_Deprecate‘ Call to std::function_namewith parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ ‘Checked Iterators‘

  • 此函數或變量已被較新的庫或操作系統功能取代。請考慮使用new_item相反。請參閱聯機幫助了解詳細信息。This function or variable has been superceded by newer library or operating system functionality. Consider using new_item instead. See online help for details.

原因Cause

當編譯器遇到函數或被標記為的變量,則會發生 C4996棄用使用__declspec(deprecated)修飾符,或當你嘗試訪問函數、 類成員或具有 C + + 14 的 typedef [[棄用]] 屬性。C4996 occurs when the compiler encounters a function or variable that is marked as deprecated by using a __declspec(deprecated) modifier, or when you attempt to access a function, class member or typedef that has the C++14 [[deprecated]] attribute. 你可以使用__declspec(deprecated)修飾符或[[deprecated]]屬性自己庫或標頭文件來警告你有關已棄用的函數、 變量、 成員或 typedef 的客戶端中。You can use the __declspec(deprecated) modifier or [[deprecated]] attribute yourself in your libraries or header files to warn your clients about deprecated functions, variables, members, or typedefs.

備註Remarks

許多函數、 成員函數,模板函數和 Visual Studio 中的庫中的全局變量標記為棄用Many functions, member functions, template functions, and global variables in the libraries in Visual Studio are marked as deprecated. 這些函數被棄用,因為它們可能具有不同的首選的名稱,可能不安全或具有更加安全的變體,或可能已過時。These functions are deprecated because they may have a different preferred name, may be insecure or have a more secure variant, or may be obsolete. 許多棄用消息包括不推薦使用的函數或全局變量的建議的替換。Many deprecation messages include a suggested replacement for the deprecated function or global variable.

若要解決此問題,我們通常建議你更改代碼以改為使用建議的更安全的或更新函數和全局變量。To fix this issue, we usually recommend you change your code to use the suggested safer or updated functions and global variables instead. 如果你需要使用現有的函數或變量,可移植性原因,可以關閉該警告。If you need to use the existing functions or variables for portability reasons, the warning can be turned off.

若要將關閉的警告,而無需解決的問題To turn the warning off without fixing the issue

你可以通過將關閉的警告的代碼的特定行警告雜註, #pragma warning(suppress : 4996)You can turn off the warning for a specific line of code by using the warning pragma, #pragma warning(suppress : 4996). 你還可以啟用警告文件中使用警告雜註, #pragma warning(disable : 4996)You can also turn the warning off within a file by using the warning pragma, #pragma warning(disable : 4996).

你可以關閉該警告全局在命令行版本中使用/wd4996命令行選項。You can turn the warning off globally in command line builds by using the /wd4996 command line option.

若要關閉的警告的 Visual Studio IDE 中的整個項目:To turn off the warning for an entire project in the Visual Studio IDE:

  • 打開屬性頁對話框為你的項目。Open the Property Pages dialog for your project. 有關如何使用屬性頁對話框的信息,請參閱屬性頁。For information on how to use the Property Pages dialog, see Property Pages.
  • 選擇配置屬性C/c + +高級頁。Select the Configuration Properties, C/C++, Advanced page.
  • 編輯禁用特定警告屬性來添加4996Edit the Disable Specific Warnings property to add 4996. 選擇確定要應用所做的更改。Choose OK to apply your changes.

你可以使用預處理器宏關閉棄用警告在庫中使用的某些特定的類。You can also use preprocessor macros to turn off certain specific classes of deprecation warnings used in the libraries. 下面介紹了這些宏。These macros are described below.

若要在 Visual Studio 中定義預處理器宏:To define a preprocessor macro in Visual Studio:

  • 打開屬性頁對話框為你的項目。Open the Property Pages dialog for your project. 有關如何使用屬性頁對話框的信息,請參閱屬性頁。For information on how to use the Property Pages dialog, see Property Pages.
  • 展開配置屬性 > C/c + + > 預處理器Expand Configuration Properties > C/C++ > Preprocessor.
  • 預處理器定義屬性,添加宏名稱。In the Preprocessor Definitions property, add the macro name. 選擇“確定” 進行保存,然後重新生成項目。Choose OK to save, and then rebuild your project.

若要僅在特定源文件中定義的宏,請添加行如#define EXAMPLE_MACRO_NAME包含的頭文件的任意行之前。To define a macro only in specific source files, add a line such as #define EXAMPLE_MACRO_NAME before any line that includes a header file.


  在 項目>屬性>配置屬性>C/C++>高級 選項右側中的 禁用特定警告 後方的文本框中添加 4996,再次F5就可以運行啦。

 還有,筆者在使用 gets 此函數時報錯,這是因為 Microsoft Visual Studio 中 gets 被更安全的 gets_s 或 fgets 函數代替了,那根據實際選用 gets_s 和 fgets 函數啦。

  gets_s()出現開始於C語言的C11標準,是原gets()的安全版本。gets()不進行數組範圍檢查,也就是說,你定義一個長度為n的數組,你可以使用gets()讀入長度大於n的字符串,編譯可能不會出錯,但運行時就會出現數組越界或內存泄露的錯誤。而gets_s()需指明待讀字符串的長度參數,防止數組越界。

  最後一個筆者遇到的一個小問題,就是當執行無限循環的語句時,CodeBlocks 直接關閉窗口或按 Ctrl + C 終止,在 Microsfot Visual Studio 2017 中也可以通過關閉命令提示符窗口直接終止運行,也可通過 Ctrl + C 終止,不過呢,這樣會報錯:

   0x74C312B5 (KernelBase.dll)處(位於 ConsoleApplication1.exe 中)引發的異常: 0x40010005: Control-C

  在彈出的 已引發異常窗口 的異常設置下 引發此異常類型時中斷 下 從以下位置引發時除外 下 KernelBase.dll 選上勾就行了,或者在 調試>窗口>異常設置 (Ctrl + Alt + E) 下的 Win32 Exceptions 項下的 0x40010005 選定右鍵 編輯條件 模塊名 不等於 KernelBase.dll 就 Ok 了

  現在大概是可以好好寫 C 了吧,用之前可以在 CodeBlocks 上運行的 C 代碼在此中運行沒什麽問題吧。當然筆者也不保證,畢竟可能有些情況沒有遇到呀。用 Microsoft Visual Studio 2017來擼 C 代碼,聽起來很有意思。與 Dev C++ 、 CodeBlocks 比起來,交互界面還行,在 工具>選項>環境>常規>視覺體驗中有 藍色、淺色和深色三種主題供選擇。字體筆者就喜歡 Mac OS 的字體 SF Mono 和 Ubuntu 系統字體 Ubuntu Mono,這字體配上主題感覺很舒服。

  筆者拿來擼了下碼,對其感覺很好。

  比如在 CodeBlocks 中整形變量沒有取地址符 & 編譯時不會報錯,然而在輸入數值進行賦值時就出錯停止。而在 Microsoft Visual Studio 2017 則在你運行檢查出來然後就報錯,這樣就避免了在輸入好了數值回車時突然出錯停止的尷尬情況;

  同樣的對一個字符類型變量如果沒有指定其大小, Microsoft Visual Studio 2017 也會在運行前檢查並報錯,不像 CodeBlocks 當執行運用該變量時才出錯停止。

  對於未使用的定義變量,Microsoft Visual Studio 2017 也會提示

  當然還有許多筆者沒有發現的功能和未知的錯誤,如 Ctrl + K +D 格式化全部代碼等等,不過經過以上設置後,想寫個 C 代碼是沒有什麽問題了,就筆者目前所能寫的範圍而言。

  本文文筆有點亂,如有錯請指出,如有遺漏也請補充。

C語言: 從 CodeBlocks 到 Microsoft Visual Studio 2017