因为工作需要,重新来过一遍C吧,不过既然要温故而知新,我们来个尽可能不一样的平台吧~
本系列入门教程环境:MacOS + GCC ,IDE 选择Jetbrains全家桶Clion,借助Cmake完成相关构建维护。
Linux/mac 通常自带gcc环境,如果是win的话大家看自己习惯吧,原则上编译器VS原生的MSVC更稳定些,但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 [目标文件名]
gcc 命令如果不指定目标文件名时默认生成的可执行文件名为 a.out(linux) 或 a.exe(windows)。
Clion操作
配置编译器:
配置运行/调试首选项
^ + R : Run
^ + D : DeBug
默认是编译完成后自动运行的,当然也可以进入默认配置路径手动运行:
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!
其中的默认路径,来自于Makefile
中的相关默认配置:
# 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
作为初章,我们不做过多展开,仅简单了解下类Unix环境下的GCC编译和Clion与Cmake的简单使用。
C90 / C99 / C11标准
在以往VS的使用过程中,一直没有太留意C语言标准对代码的影响,但既然Clion把这个问题抛出来了,那我们在入门系列的开始还是简单提及下。
C90 习惯上也会有称C89,因为是ISO在1990年批准了 ANSI在1989年提出的ANSI C(C89) 。而C99和C11分别对应1999年和2011年。
C99 标准新增特性:内联函数(inline functions)、可变长度的数组、灵活的数组成员(用于结构体)、复合字面量、指定成员的初始化器、对IEEE754浮点数改进、支持不定参数个数的宏定义,在数据类型上增加了 long long int 以及复数类型等。
C11标准新增特性:字节对齐说明符、泛型机制(generic selection)、对多线程的支持、静态断言、原子操作以及对 Unicode 的支持等。
撇开这些对于对于新手并不友好的概念暂且不谈,其实随着版本更迭也会带来很多经常使用的特性。如类似java等语言的单行注释语法//
,此语法在C99标准才开始引入,再比如无return函数定义,void main()
,在C99标准以前是允许main()
这种语法作为等价存在的。不过讲到这里啦,顺便提一嘴,C标准中从未出现过void main()
或main()
的语法标准,只有int main(void)
和int main(int argc,char *argv[])
两种标准,但编译器却容忍啦void main()
的存在,至于什么是对,什么是错,我们就不在这个入门系列探讨这么绅士的问题啦,我们能做的就是接受合理的标准,保持优雅的代码风格。
so,本系列教程将按照C11标准进行学习。