基本上每门语言都是用"helloworld"做为她的第一讲,C语言也不例外。程序员
传统的教材都是让你安装一种IDE集成环境,而后照例子敲入代码,按下ctrl+r之类的运行程序,感觉一下运行的结果。HelloWorld程序以下:shell
#include <stdlib.h> #include <stdio.h> void main() { printf("Hello World\n"); }
[zhoukai@zhoukai-MBPR:tmp]$HelloWorld
#include<stdlib.h>
这样的语句进行预处理生成最终的代码源文件,而后编译成与特定类型的操做系统相关的目标代码,这个目标代码其实能够在只要与当时生产的操做系统类型相同的操做系统中重复使用的,而后是连接成目标文件,这个文件大多数也能够在相同的操做系统中直接使用,可是因为有的程序会依赖特定的库,因此出表现出不能运行成功的状况罢了。好比刚才的helloworld程序在类Unix系统中,使用以下操做生成可执行文件:[zhoukai@zhoukai-MBPR:tmp]$gcc main.c
而后是运行:vim
[zhoukai@zhoukai-MBPR:tmp]$./a.out [zhoukai@zhoukai-MBPR:tmp]$HelloWorld
能够执行环境就是开启一个终端程序,而后./a.out
运行。编辑器
守则一:一个负责的程序员编写程序要考虑可移植性函数
int main(int argc, const char *argv[]) { ... }
其中的形式参数的做用就是接收运行时传入的命令参数,后面咱们会讨论到。操作系统
###使用全局复用调试
全局变量基本是没种语言都支持的,即为全局,便是对全部人可见code
有一天你的老板说,如今咱们生意很差,咱们要改程序输出的内容,发发牢骚,而不是友好的问候。偏偏这要交给你来作,并且当时没有使用任何全局变量或着宏来代替这些输出内容,并且涉及的几十个文件多是零零散散的分布在好几百个位置中,那么恭喜你,即便使用多文件文本替换也是挺麻烦的事,并且你老是要修改好几十个文件。若是当时使用全局变量也很好用修改的。开发
extern char g_SayHello[];
char g_SayHello[] = "Kick the bucket!";
... #include "utils.h" ... int main(int argc, const char *argv[]) { printf("%s\n", g_SayHello); return EXIT_SUCCESS; }
[zhoukai@zhoukai-MBPR:tmp]$ gcc main_helloworld.c utils.c [zhoukai@zhoukai-MBPR:tmp]$ ./a.out Kick the bucket! [zhoukai@zhoukai-MBPR:tmp]$
###使用宏复用编译器
宏是c语言强有力的特性之一,不使用宏,你会作不少不讨喜的工做,可是滥用宏也会不讨喜,全部任何东西都有利有弊。就像没有坏人,就体现不出好人;没有细菌这样的微生物,满世界都是尸体同样。这个是一个哲学问题〜〜〜
//稍做解释,下面的宏定义是关联预编译条件宏使用,即若是没有定义宏,则定一个默认的宏 #ifndef SAY_HELLO #define SAY_HELLO "Kick the bucket!" #endif
int main(int argc, const char *argv[]) { printf("%s\n", SAY_HELLO); return EXIT_SUCCESS; }
[zhoukai@zhoukai-MBPR:tmp]$ gcc main_helloworld.c utils.c -DSAY_HELLO=\"Drop\ dead\!\" -o a.out [zhoukai@zhoukai-MBPR:tmp]$ gcc main_helloworld.c utils.c -DSAY_HELLO=\"Go\ to\ hell\!\" -o ab.out [zhoukai@zhoukai-MBPR:tmp]$ gcc main_helloworld.c utils.c -DSAY_HELLO=\"Damn\ you\!\" -o abc.out [zhoukai@zhoukai-MBPR:tmp]$ ./a.out Drop dead! [zhoukai@zhoukai-MBPR:tmp]$ ./ab.out Go to hell! [zhoukai@zhoukai-MBPR:tmp]$ ./abc.out Damn you! [zhoukai@zhoukai-MBPR:tmp]$
稍做解释,gcc最简单的使用就是
gcc <源文件名>
,而后就会生成默认的程序文件a.out,可是通常都但愿又一个自定义的程序文件名,因此加上选项参数-o <目标名>
;在不加-c <源文件名>
的状况下都是直接完成三部曲,生成可执行文件的;其它还有不少可选的参数,后面慢慢说。
为何要写这么多,其实也不是高深的代码。目的就是一个,你在编写代码的时候是否比别人多想了一步呢?是否考虑过代码的可移植性呢?是否考虑过代码的可复用性呢?是否考虑过代码的可维护性呢?这些!都是一名合格的程序员应该考虑的问题。