forum.jpg
HelloWorld
在文章嵌入式Linux开发之《C语言专题概述》 中概述了《C语言专题》部分将要讲的一些内容。从本文章开始会陆续更新这一部分,今天通过一个最简单同时又是经典的C代码例子-hello world.c,通过这个代码来对C语言有一个整体的认识。
先上代码:
#include <stdio.h>
  • int main(int argc,char** argv)
  • {
  •          //输出hello world
  •          printf("hello world\n");
  •          
  •          return 0;
  • }
  • 复制代码
    解释这段代码之前,先补充2个概念:源文件和头文件 源文件:源代码文件,C语言中源文件后缀名是.c,C++语言中源文件后缀名是.cpp,Java后缀名是.java。头文件:包含函数及变量的声明(声明和定义概念后续讲解,这里先提一下),有些也包含函数的定义(比如inline内敛函数),函数的实现部分往往是在源代码中也即相应的.c文件中,头文件的后缀名是.h。C语言代码由源文件和头文件组成。
    将上面代码归类表示如下:
    (1)关键字: int char return C语言标准定义中有32个关键字,这些关键字系统已经帮我们定义好了,我们只需要搞懂它会使用即可。后续再讲解C语言时会陆续讲解。
    (2)变量及参数:argv argv 在C语言开发中往往需要定义变量,这些变量在程序的执行过程中会进行相应的运算操作,操作的结果是我们所需要的。比如最简单的加、减、乘和除操作。定义变量时要注意变量名一定不要和关键字重复,否则会报错。
    (3)变量及参数类型:int char 我们在定义变量时要给定相应的类型,类似于不同的水果有不同的味道一样,因为变量是存储在内存中而每一种类型占不同的空间。比如int类型在32位操作系统中占4个字节,char占一个字节。
    (4)函数:main printf 函数是C语言的组成单位,我们根据相应的功能编写相应的函数。函数的参数、返回值是可有可无的,具体根据功能来定。比如说这里的main和printf函数。printf常常作为输出以及调试代码用。main函数比较特殊又重要(曾经的笔试、面试题),它是整个程序的入口,被操作系统来调用,其他的函数被main函数直接或者间接调用。那么可以有多个吗?不可以,如果有多个,操作系统不知道来调用哪个main函数。main函数有多种写法:
    void main(void)
  • int main()
  • int main(void)
  • int main(int argc,char** argv)
  • int main(int argc,char* argv[])
  • 复制代码
    前2种用法在单片机开发中常见,但是在嵌入式linux开发中最好用后面3种的写法,第3种写法表示没有参数,第4和第5种写法有参数,并且等价。因为main函数确实是返回值的,参数是可选的。操作系统会根据main函数的返回值来判断程序的正确执行与否,如果返回void,那代表的是什么状态呢?而且一些编译器支持这种写法,一些编译器不支持。那么写法1和2为什么不出错?因为C语言被设计出来到C90标准发布这段时间,对C语言不同的实现就导致了对main函数的差异性。为了代码的通用可移植性,建议采用标准提供的形式。
    (5)预编译指令:#include 将代码文件需要用到的函数声明、常量等包含到代码文件中。它不是C语言的关键字,而是属于一种预编译的指令。预编译属于预处理的一部分,详细的预处理会在后续文章中介绍,这里点到为止。#include< >:主要是用来包含头文件 <> 表示我们所包含的内容是在系统路径下,是系统自带的,我们直接用就可以。系统在编译时会 自动到系统路径下找相应文件。与之对应的#include" " 表示所包含的文件是我们自己写的。在编译时系统会先在你项目的当前目录查找是否有对应头文件,如果没有,它会到系统路径中去查找对应的头文件。此处包含stdio.h的原因是后面代码中用到了printf函数,printf函数被包含在stdio.h中,可以在linux系统中用linux 命令man 2 printf 查找对应的头文件(如果对linux命令不熟悉,可以阅读我写的关于linux命令的几篇文章:嵌入式软件开发之《Linux命令专题(一)》)
    (6)分号:;表示一行代码的结束
    (7)注释:注释是给程序员看的。C语言中注释的方式有"//"和“/* /” 2种表示方法。"//"一般用于单行的注释,“/ */”一般用于整块的注释。注释在代码预处理后就会消失,所以注释不会加重代码的大小。但是也不要每一行都写注释,这样代码会显得臃肿,应该在“合适的地方”加上“合适的注释”。
    以上的7部分都属于C语言的范畴,通过这段代码让大家对C语言有一个认识,后续慢慢讲。
    最后补充编写C语言代码的步骤:
    1)编写源代码
    2)编译源代码
    3)执行编译生成的可执行文件
    4)调试。如果执行的结果与自己想的不一样,那么就需要反复进行调试,知道符合自己的要求。
    运行结果如下图所示:linux中的编译器是gcc,如果在编译时加上-o 可执行文件名,会 将源文件helloworld.c编程成目标文件helloworld,之后 执行helloworld; 如果在编译时不加上目标文件,那么可执行文件是a.out
    forum.jpg
    执行过程
    编写C语言源代码的工具可以是vs,codeblocks,它是在windows下编辑、编译及运行。做嵌入式linux开发,一般是在windows下编辑源代码,可以用Notepad++也可以用Sourceinsight,在linux中编译并执行,原因是Linux中编辑源代码软件没有windows下灵活。这个自己用一下就知道了。
    注意:代码是调试出来的,不是写出来的,所以大家一定要学会调试代码。