因?yàn)楣ぷ餍枰略鳎匦聛磉^一遍C吧尉尾,不過既然要溫故而知新蚂子,我們來個(gè)盡可能不一樣的平臺(tái)吧~
本系列入門教程環(huán)境:MacOS + GCC ,IDE 選擇Jetbrains全家桶Clion斥扛,借助Cmake完成相關(guān)構(gòu)建維護(hù)入问。
Linux/mac 通常自帶gcc環(huán)境,如果是win的話大家看自己習(xí)慣吧犹赖,原則上編譯器VS原生的MSVC更穩(wěn)定些队他,但MinGW等依然是成熟的替代方案卷仑。
rabbitmask@promote ~ % gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.31.1)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
萬物入門:Hello峻村,World!
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
rabbitmask@promote demo % gcc main.c
rabbitmask@promote demo % ls
CMakeLists.txt a.out cmake-build-debug main.c
rabbitmask@promote demo % ./a.out
Hello, World!
gcc [源文件名] -o [目標(biāo)文件名]
gcc 命令如果不指定目標(biāo)文件名時(shí)默認(rèn)生成的可執(zhí)行文件名為 a.out(linux) 或 a.exe(windows)锡凝。
Clion操作
配置編譯器:
配置運(yùn)行/調(diào)試首選項(xiàng)
^ + R : Run
^ + D : DeBug
默認(rèn)是編譯完成后自動(dòng)運(yùn)行的粘昨,當(dāng)然也可以進(jìn)入默認(rèn)配置路徑手動(dòng)運(yùn)行:
rabbitmask@promote demo % cd cmake-build-debug
rabbitmask@promote cmake-build-debug % ls
CMakeCache.txt CMakeFiles Makefile Testing ccl.c cmake_install.cmake demo demo.cbp
rabbitmask@promote cmake-build-debug % ./demo
Hello, World!
其中的默認(rèn)路徑,來自于Makefile
中的相關(guān)默認(rèn)配置:
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /Users/rabbitmask/Desktop/SourceCode/C/demo
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /Users/rabbitmask/Desktop/SourceCode/C/demo/cmake-build-debug
作為初章窜锯,我們不做過多展開张肾,僅簡(jiǎn)單了解下類Unix環(huán)境下的GCC編譯和Clion與Cmake的簡(jiǎn)單使用。
C90 / C99 / C11標(biāo)準(zhǔn)
在以往VS的使用過程中锚扎,一直沒有太留意C語言標(biāo)準(zhǔn)對(duì)代碼的影響吞瞪,但既然Clion把這個(gè)問題拋出來了,那我們?cè)谌腴T系列的開始還是簡(jiǎn)單提及下驾孔。
C90 習(xí)慣上也會(huì)有稱C89芍秆,因?yàn)槭荌SO在1990年批準(zhǔn)了 ANSI在1989年提出的ANSI C(C89) 惯疙。而C99和C11分別對(duì)應(yīng)1999年和2011年。
C99 標(biāo)準(zhǔn)新增特性:內(nèi)聯(lián)函數(shù)(inline functions)妖啥、可變長(zhǎng)度的數(shù)組霉颠、靈活的數(shù)組成員(用于結(jié)構(gòu)體)、復(fù)合字面量荆虱、指定成員的初始化器蒿偎、對(duì)IEEE754浮點(diǎn)數(shù)改進(jìn)、支持不定參數(shù)個(gè)數(shù)的宏定義怀读,在數(shù)據(jù)類型上增加了 long long int 以及復(fù)數(shù)類型等诉位。
C11標(biāo)準(zhǔn)新增特性:字節(jié)對(duì)齊說明符、泛型機(jī)制(generic selection)菜枷、對(duì)多線程的支持不从、靜態(tài)斷言、原子操作以及對(duì) Unicode 的支持等犁跪。
撇開這些對(duì)于對(duì)于新手并不友好的概念暫且不談椿息,其實(shí)隨著版本更迭也會(huì)帶來很多經(jīng)常使用的特性。如類似java等語言的單行注釋語法//
坷衍,此語法在C99標(biāo)準(zhǔn)才開始引入寝优,再比如無return函數(shù)定義,void main()
枫耳,在C99標(biāo)準(zhǔn)以前是允許main()
這種語法作為等價(jià)存在的乏矾。不過講到這里啦,順便提一嘴迁杨,C標(biāo)準(zhǔn)中從未出現(xiàn)過void main()
或main()
的語法標(biāo)準(zhǔn)钻心,只有int main(void)
和int main(int argc,char *argv[])
兩種標(biāo)準(zhǔn),但編譯器卻容忍啦void main()
的存在铅协,至于什么是對(duì)捷沸,什么是錯(cuò),我們就不在這個(gè)入門系列探討這么紳士的問題啦狐史,我們能做的就是接受合理的標(biāo)準(zhǔn)痒给,保持優(yōu)雅的代碼風(fēng)格。
so骏全,本系列教程將按照C11標(biāo)準(zhǔn)進(jìn)行學(xué)習(xí)苍柏。