1 Linux下C应用开发学习前言
标准C - 基础,不考虑平台
Unix/Linux下C的开发 - Unix/Linux系统
操作系统: 内存管理、文件/目录管理、进程管理、线程管理、网络支持、信号、IPC进程间通信
学习主要是理论+系统函数,以系统函数应用为主
理论上的东西 尽可能理解,系统函数要求熟练使用。
学习方法:
1 要多花时间和精力,有付出才有收获,付出越多,收获越多。
2 程序员首先做项目,动手是第一位。
3 多问,对自己严格一点。
4 每个月有目标,检测自己是否达到。
计算机的常识(了解)
主流的操作系统:
Windows系列
Unix和类Unix操作系统
安卓 (手机)
IOS (手机)
Win phone8(手机)
Linux系统是一个类Unix系统的内核,GNU项目提供了SHELL,兼容了POSIX标准,同时用 GPL 解决了版权问题。Linux得到了很大的发展。
标准、产品和项目
标准是行业规范,整个行业都必须遵守。标准无本万利。标准 一般都是 行业协商制定。
产品是成熟的软件,产品针对的是所有客户,而不是 只考虑特定的群体。对质量的要求更高。
项目是针对特定客户的,是定制软件。做项目的公司最多,但也是最累的。
程序员找工作的流程:
写简历(差异化)->被通知笔试(背笔试题)->面试(两轮-人力、技术)->等待
2 gcc的编译过程
gcc的选项:
-c 只编译,不链接
-o 指定目标文件名
-std 指定C标准
-E 预处理,不编译
-S 汇编,生成 .s文件
-Wall 显示更多的警告信息
-v 查看gcc的版本号。
gcc可以对代码进行预处理、编译、汇编、连接
主流的计算机语言 - 高级语言 转
汇编语言 转
机器语言
gcc -E hello.c -ohello.i 预处理的结果
gcc -c hello.c 预处理、编译和汇编
gcc -S hello.c 生成汇编文件
gcc hello.c 包含:预处理、编译、汇编和连接
hello.c
#include <stdio.h>
int main(){
printf("hello c\n");
//sfasfdafdafdklajfldkaf();
return 0;
}
3 常用的预处理指令
常用的指令:
#include
#define
条件编译 #if/elif/else/ifdef/ifndef/endif
#warning #error 产生警告 产生错误
#include 后面可以跟 “” 或 <>,区别:
“”包括了当前目录,而 <>不包括
#pragma 可以额外增加一些功能
#pragma GCC dependency 文件名
当前文件依赖于 dependency后面文件,dependency后面文件的最后修改时间比当前文件的晚,就会产生一个警告。
#pragma GCC poison 单词
把poison后面的单词声明为毒药,不能被使用,否则产生错误。
#pragma pack(数字n) 指定对齐/补齐字节数
#include <stdio.h>
#define VERSION 3
#if (VERSION<3)
#error "版本太低"
#elif (VERSION>3)
#warning "版本太高"
#endif
//hello.c不能比当前文件新,否则警告
#pragma GCC dependency "hello.c"
#pragma GCC poison goto //定义goto为禁用
#pragma pack(2)//按数字的整数倍对齐和补齐
int main(){
//goto ok;//不能再使用goto
printf("hello c\n");
ok:printf("goto\n");
struct s{
char c1; int i; char c2;
};
printf("size=%d\n",sizeof(struct s));
return 0;
}
4 环境变量
操作系统在启动后都有一个运行环境,在环境中有很多的变量去控制不同的操作。比如:Path(PATH)叫系统路径,所有可执行程序默认会去系统路径中查找。
Unix系统由内核和shell组成,shell是连接内核和用户的接口(桥梁)。Unix常用的Shell:
sh - 最古老的shell,现在不太好用
csh - 基于C程序员的shell,专业性强
bash- sh的增强版,常用。
Unix中PATH的配置:(bash下)
配置 登陆目录(~)下的.bashrc文件,vi .bashrc,在最后加上一行
export PATH=$PATH:.
没写错保存退出
生效:source .bashrc 当前窗口生效,或者重启后生效。
echo $PATH 可以打印PATH内容。
5 头文件
头文件写各种声明和各种定义,.c文件写C语言的函数代码。
关于头文件:
1 各种声明和定义写入头文件。
2 找不到头文件会引发致命错误。
3 自定义头文件的写法:
#ifndef XXX_H_
#define XXX_H_
…
#endif
4 自定义头文件的查找方案:
a 用 “” 找自定义头文件,支持带路径
b 把自定义头文件放入系统路径(不建议)
c 使用gcc -I 头文件所在目录(最通用)
d 使用环境变量 CPATH
export CPATH=.
add.h
#ifndef __ADD__H__
#define __ADD__H__
int add(int,int);
double add2(double,double);
#endif //__ADD__H__
add.c
int add(int a,int b){
return a+b;
}
double add2(double a,double b){
return a+b;
}
#include <stdio.h>
//#include "add.h"
#include <add.h>
int main(){
int r = add(2,3);
double d = add2(1.0,4.0);
printf("r=%d,d=%lf\n",r,d);
}