在Visual Studio 2017中官方新增了Clang編譯器拥坛,當(dāng)前版本基于Clang 3.8.0,我們在安裝Visual Studio 2017時可以選擇安裝此組件尘分。這里筆者將為大家介紹一下如何安裝猜惋、設(shè)置、使用Clang編譯器培愁。筆者所使用的是Visual Studio 2017 Community Edition著摔。
首先,我們先安裝Visual Studio 2017定续,完成之后會彈出你想要安裝的一些插件梨撞,如下圖所示:
這里如果我們僅僅只是想開發(fā)純C語言程序的話就選擇“使用C++的桌面開發(fā)”即可,無需去選其他選項香罐。然后在右邊卧波,我們展開“單個組件”,然后勾選上“Clang/C2”庇茫,如下圖所示:
如果您之前已經(jīng)裝好了Visual Studio 2017也不用驚慌港粱,您可以打開Visual Studio 2017 installer程序,也能進入選擇安裝插件的界面旦签。
這些全都完成之后查坪,我們就可以新建一個C語言項目工程啦~
我們打開Visual Studio 2017,在歡迎界面中找到“新建項目”一欄宁炫,然后點擊“創(chuàng)建新項目...”這個藍色按鈕偿曙,如下圖所示:
接著會彈出新建項目對話框,如下圖所示羔巢。我們先選擇左邊的“Visual C++”下面的“Windows桌面”項望忆,然后選擇右邊的“Windows控制臺應(yīng)用程序”,然后自己設(shè)置好項目名稱以及工程所存放的路徑竿秆,點擊“完成”即可启摄。
進入項目工程后,我們先不要捉急幽钢,先確定好自己要開發(fā)的是基于32位的程序還是基于64位的程序歉备。如果我們要寫的是基于64位的應(yīng)用程序的話,先選擇x64匪燕,如下圖所示:
接著蕾羊,如果我們想在自己的工程中放入?yún)R編代碼喧笔,那么可以按下圖所示讓當(dāng)前的項目工程支持masm匯編器。
這里我們先選中右側(cè)欄中之前自己命名好的項目龟再,然后點擊鼠標右鍵溃斋,在彈出的項目欄中選擇“生成依賴項”,最后點擊“生成自定義”吸申。然后會彈出一個對話框梗劫,最后勾選上“masm”即可,按“確定”按鈕截碴,如下圖所示梳侨。
下面,我們要正式開始設(shè)置Clang編譯器了日丹。我們先選擇菜單欄中的“項目”走哺,然后點擊“xxx屬性”,如下圖所示哲虾。
然后彈出配置對話框丙躏。我們這里務(wù)必當(dāng)心,先設(shè)置配置項束凑,選擇“所有配置”晒旅,如果不是選“所有配置”,那么下面的配置僅針對當(dāng)前模式有效(Debug或Release模式)汪诉。隨后废恋,我們點擊左側(cè)欄中的“常規(guī)”,然后在右邊找到“平臺工具集”扒寄,將它設(shè)置為“Visual Studio 2017 - Clang with Microsoft CodeGen”鱼鼓,如下圖所示。
接著该编,我們展開左側(cè)欄中的“C/C++”一欄迄本,點擊“預(yù)編譯頭”,然后在右邊將“預(yù)編譯頭”設(shè)置為“不使用預(yù)編譯頭”课竣,如下圖所示嘉赎。
此時,我們可以點擊“完成”按鈕稠氮,關(guān)閉屬性設(shè)置對話框曹阔,然后要做一件事情半开,把我們當(dāng)前項目工程中的所有頭文件隔披、源文件全都刪干凈!如下圖所示寂拆。
然后新建一個C源文件奢米,比如名為main.c抓韩。我們先鼠標右鍵點擊右邊項目工程中的“源文件”,然后選擇“添加”鬓长,點擊“新建項”谒拴,如下圖所示。
完了之后會彈出新建文件的對話框涉波。我們在左側(cè)欄選中“代碼”英上,然后在右側(cè)欄選中“C++文件”。由于我們要新建的是一個C文件啤覆,而不是C++文件苍日,因此我們在命名文件名的時候必須顯式地將.c后綴名添加上!如下圖所示:
完成之后我們先不捉急寫代碼窗声,而是再進入菜單欄中“項目”里的“xxx屬性”相恃,此時要選中“C/C++”一欄中的“語言”,然后會出現(xiàn)“C語言標準”這一項笨觅,將它設(shè)置為“C11 (GNU Dialect) (-std=gnu11)”拦耐,這樣我們才能真正使用基于GNU11標準的C語言!如下圖所示:
下面我們終于可以開始敲代碼啦~我們可以嘗試以下代碼:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
// 由于VS-Clang目前不太成熟见剩,
// 因此這里必須讓stdnoreturn放在最后包含
#include <stdnoreturn.h>
#ifndef var
#define var __auto_type
#endif
static void noreturn ProgramTerminate(void)
{
printf("Program terminated...");
getchar();
exit(0);
}
static void __attribute__((overloadable)) Foo(void)
{
puts("This is Foo!");
}
static void __attribute__((overloadable)) Foo(int a)
{
printf("Foo a = %d\n", a);
}
extern int MyASMFunc(int a, int b);
int main(void)
{
puts("Hello, Clang!");
uint32_t a = 100;
bool b = a > 50;
printf("b = %d\n", b);
_Static_assert(sizeof(a) == 4, "Not compatible environment!");
var s = "Hello, world!";
printf("The string is: %s\n", s);
Foo();
Foo(a);
const var value = MyASMFunc(10, 8);
printf("value = %d\n", value);
ProgramTerminate();
}
上述代碼中杀糯,MyASMFunc函數(shù)是在一個匯編文件中實現(xiàn)的。我們可以用添加main.c文件的方式添加匯編文件苍苞,同樣鼠標右鍵點擊“源文件”火脉,然后選擇“新建項”。進入對話框后柒啤,同樣選擇“C++文件”倦挂,然后在下方文件名中寫上比如test.asm。各位需要注意的是担巩,在VS中匯編文件名后綴用的是.asm方援,而在其他編譯工具鏈中往往使用.s作為匯編文件后綴名。
然后我們在匯編文件中添加以下內(nèi)容:
.code
MyASMFunc proc public
sub ecx, edx
mov eax, ecx
add eax, 2
ret
MyASMFunc endp
END
最后涛癌,我們點擊綠色三角箭頭即可構(gòu)建運行咯~這段程序在編譯時將不會有任何warning犯戏。