0%

import is a feature provided by the GCC compiler, which is what Xcode uses when you’re compiling Objective- C, C, and C++ programs. #import guarantees that a header file will be included only once, no matter how many times the #import directive is actually seen for that file.

NOTE

In C, programmers typically use a scheme based on the #ifdef directive to avoid the situation where one file includes a second file, which then, recursively, includes the first.

In Objective- C, programmers use #import to accomplish the same thing.

So import equals to ifndef plus include.

关于断言assert的使用

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

1
2
3
#include <assert.h>

void assert( int expression );

assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

但是使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG` 来禁用assert调用。

我比较常用的比如断言分母不能是0等等。

程序编译的过程

一个程序的编译,需要完成词法分析、语法分析、中间代码生成、代码优化、目标代码生成。
而编译的过程包括预处理preprocessing、编译compilation、汇编assembly和链接linking。

  1. 词法分析。词法分析指的是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个单词符号,然后把字符串的源程序改造成单词符号串的中间程序。在编译程序时,这一过程是自动完成的。编译程序会对代码的每个单词进行检查,如果单词发生错误,编译过程就会停止并显示错误,这时需要对程序中的错误进行修改。
  2. 语法分析。语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语句。例如,需要检查表达式、赋值、循环等结构是否完整和符合使用规则。在语法分析时,会分析出程序中错误的语句,并显示出结果。如果语法发生错误,编译任务是不能完成的。
  3. 中间代码生成。中间代码是源程序的一种内部表示,或称中间语言。程序进行词法分析和语法分析以后,将程序转换成中间代码,这一转换的作用是使程序的结构更加简单和规范。中间代码生成操作是一个中间过程,与用户无关。
  4. 代码优化。代码优化是指对程序进行多种等价变换,使得变换后的程序能生成更有效的目标代码。用户可以在编译程序时设置代码优化的参数,可以针对不同的环境和设置进行优化。
  5. 目标代码生成。目标代码生成指的是产生可以执行的应用程序,这是编译的最后一个步骤。生成的程序是二进制形式的机器语言,用户只能运行这个程序,而不能打开这个文件查看程序的代码。

简介

pkg-config 主要解决软件库的依赖问题,特别是在不同的平台,安装的软件目录不同的情况下,可以很优雅地解决。这一切都是自动的,不用担心库文件放在什么地方。

1
pkg-config - Return metainformation about installed libraries

比如对于同样安装了gtk的系统而言,使用下来命令

1
pkg-config --libs --cflags gtk+-2.0

MacOSX输出为:

1
-D_REENTRANT -I/usr/local/Cellar/gtk+/2.24.31_1/include/gtk-2.0 -I/usr/local/Cellar/gtk+/2.24.31_1/lib/gtk-2.0/include -I/usr/local/Cellar/pango/1.40.14/include/pango-1.0 -I/usr/local/Cellar/harfbuzz/1.7.5/include/harfbuzz -I/usr/local/Cellar/graphite2/1.3.10/include -I/usr/local/Cellar/pango/1.40.14/include/pango-1.0 -I/usr/local/Cellar/atk/2.26.1/include/atk-1.0 -I/usr/local/Cellar/cairo/1.14.12/include/cairo -I/usr/local/Cellar/pixman/0.34.0_1/include/pixman-1 -I/usr/local/Cellar/fontconfig/2.12.6/include -I/usr/local/opt/freetype/include/freetype2 -I/usr/local/Cellar/libpng/1.6.34/include/libpng16 -I/usr/local/Cellar/gdk-pixbuf/2.36.11/include/gdk-pixbuf-2.0 -I/usr/local/Cellar/libpng/1.6.34/include/libpng16 -I/usr/local/Cellar/glib/2.54.3/include/glib-2.0 -I/usr/local/Cellar/glib/2.54.3/lib/glib-2.0/include -I/usr/local/opt/gettext/include -I/usr/local/Cellar/pcre/8.41/include -L/usr/local/Cellar/gtk+/2.24.31_1/lib -L/usr/local/Cellar/pango/1.40.14/lib -L/usr/local/Cellar/atk/2.26.1/lib -L/usr/local/Cellar/cairo/1.14.12/lib -L/usr/local/Cellar/gdk-pixbuf/2.36.11/lib -L/usr/local/Cellar/glib/2.54.3/lib -L/usr/local/opt/gettext/lib -lgtk-quartz-2.0 -lgdk-quartz-2.0 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl -Wl,-framework -Wl,CoreFoundation

CentOS输出为:

1
-pthread -I/usr/include/gtk-2.0 -I/usr/lib64/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng15 -I/usr/include/libdrm  -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfontconfig -lgobject-2.0 -lglib-2.0 -lfreetype

可以看出还是有很大差别的,所以对于下面的示例程序:

1
2
3
4
```

编译的时候,直接使用下面的命令即可,而不用关注操作系统。

gcc -o test main.c pkg-config --libs --cflags gtk+-2.0


没有规矩不成方圆 sort

Linux sort 命令用于将文本内容进行排序。

官方定义为:

sort - sort lines of text files

语法

1
2
$ sort [OPTION]... [FILE]...
$ sort [OPTION]... --files0-from=F

常用的参数为

  • -c 检查文件是否已经按照顺序排序。
  • -u 意味着是唯一的(unique),输出的结果是去完重了的。
  • -r 以相反的顺序来排序。
  • -k field1[,field2] 按指定的列进行排序。

这里假定测试文件名为testfile

1
2
3
4
5
6
7
LiSi            80

ZhangSan 70

WangWu 90

MaLiu 88

默认无参数

在使用 sort 命令以默认的式对文件的行进行排序,命令如下:

1
2
3
4
5
6
7
8
$ sort testfile 



LiSi 80
MaLiu 88
WangWu 90
ZhangSan 70

sort 命令默认情况下将第一列以 ASCII 码的次序排列,并将结果输出到标准输出。

根据第N列排序

对于测试文件而言,或许我们更希望使用数字来统计排序,此时可以使用-k N参数,其中N为列数

1
2
3
4
5
6
7
8
$  sort testfile -k 2



ZhangSan 70
LiSi 80
MaLiu 88
WangWu 90

指定分隔符,进行排列

此时默认的分隔符为空格,如果是其他分隔符,比如分毫

检查是否已经排序

在某些情况下,或许只想看看文件是否已经排序,使用-c参数 :

1
2
$  sort -c testfile
sort: testfile:2: disorder

如果没有排序会有输出,而排序的话就没有输出。

逆序排列

如果希望看一下数字从高到低的培训,使用-r参数:

1
2
3
4
5
$  sort testfile -k 2  -r
WangWu 90
MaLiu 88
LiSi 80
ZhangSan 70

对一个使用冒号分隔的文件的第二项进行排序

$ sort -t: -k 2 names.txt

对使用tab分隔的第三项进行排序**(department_id),**并去掉重复项

$ sort -t: -u -k 3 names.txt

passwd文件的第三项进行排序**(userid)**

$ sort -t: -k 3n /etc/passwd | more

基于ip地址对**/etc/hosts**文件排序

$ sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n /etc/hosts

与其它命令组合在一起使用

ps –ef | sort : 对进程列表进行排序

ls -al | sort +4n : 使用升序对ls -al的输出以文件大小进行排序(第5项)

ls -al | sort +4nr : 使用降序对ls -al的输出以文件大小进行排序(第5项)

Linux的 sort 命令

Linux sort 命令用于将文本内容进行排序。

官方定义为:

sort - sort lines of text files

语法

1
2
$ sort [OPTION]... [FILE]...
$ sort [OPTION]... --files0-from=F

常用的参数为

  • -c 检查文件是否已经按照顺序排序。
  • -u 意味着是唯一的(unique),输出的结果是去完重了的。
  • -r 以相反的顺序来排序。
  • -k field1[,field2] 按指定的列进行排序。

这里假定测试文件名为testfile

1
2
3
4
5
6
7
LiSi            80

ZhangSan 70

WangWu 90

MaLiu 88

默认无参数

在使用 sort 命令以默认的式对文件的行进行排序,命令如下:

1
2
3
4
5
6
7
8
$ sort testfile 



LiSi 80
MaLiu 88
WangWu 90
ZhangSan 70

sort 命令默认情况下将第一列以 ASCII 码的次序排列,并将结果输出到标准输出。

根据第N列排序

对于测试文件而言,或许我们更希望使用数字来统计排序,此时可以使用-k N参数,其中N为列数

1
2
3
4
5
6
7
8
$  sort testfile -k 2



ZhangSan 70
LiSi 80
MaLiu 88
WangWu 90

检查是否已经排序

在某些情况下,或许只想看看文件是否已经排序,使用-c参数 :

1
2
$  sort -c testfile
sort: testfile:2: disorder

如果没有排序会有输出,而排序的话就没有输出。

逆序排列

如果希望看一下数字从高到低的培训,使用-r参数:

1
2
3
4
5
6
7
8
$  sort testfile -k 2  -r
WangWu 90
MaLiu 88
LiSi 80
ZhangSan 70



  • -b 忽略每行前面开始出的空格字符。

  • -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。

  • -f 排序时,将小写字母视为大写字母。

    -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。

  • -m 将几个排序好的文件进行合并。

  • -M 将前面3个字母依照月份的缩写进行排序。

  • -n 依照数值的大小排序。

  • -o<输出文件> 将排序后的结果存入指定的文件。

  • -t<分隔字符> 指定排序时所用的栏位分隔字符。

  • +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

你是唯一的 uniq

.. note::
安得有车马,尚无渔与樵。
宋·王安石《游章义寺》

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

官方定义为:

uniq - report or omit repeated lines

uniq 可检查文本文件中重复出现的行列。

语法

语法比较简单,直接用就可以。

1
$ uniq [OPTION]... [INPUT [OUTPUT]]

常用的参数为:

  • -c--count 在每列旁边显示该行重复出现的次数。

  • -d--repeated 仅显示重复出现的行列。

  • -u--unique 仅显示出一次的行列。

假定有1个文件为testfile,内容如下:

1
2
3
4
5
6
7
8
9
10
11
testfile
Hello 1
Hello 2
Hello 2
Hello 3
Hello 3
Hello 3
Hello 4
Hello 4
Hello 4
Hello 4

默认无参数

使用uniq 命令可以删除重复的行,不管有多少重复的行,仅仅显示一行。

1
2
3
4
5
$  uniq testfile
Hello 1
Hello 2
Hello 3
Hello 4

统计出现频次

如果希望统计每一行出现的频次,可以使用-c参数,其中第一行输出为出现的次数

1
2
3
4
5
$  uniq -c testfile
1 Hello 1
2 Hello 2
3 Hello 3
4 Hello 4

仅仅显示重复的行

在某些情况下,或许只想看到有重复的列,使用-d参数 :

1
2
3
4
$  uniq -d testfile
Hello 2
Hello 3
Hello 4

仅仅显示不重复的行

而某些情况下,或许只想看到不重复的列,使用-u参数:

1
2
$  uniq -u testfile
Hello 1

Linux的 uniq 命令

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

官方定义为:

uniq - report or omit repeated lines

uniq 可检查文本文件中重复出现的行列。

语法

语法比较简单,直接用就可以。

1
$ uniq [OPTION]... [INPUT [OUTPUT]]

常用的参数为:

  • -c--count 在每列旁边显示该行重复出现的次数。

  • -d--repeated 仅显示重复出现的行列。

  • -u--unique 仅显示出一次的行列。

假定有1个文件为testfile,内容如下:

1
2
3
4
5
6
7
8
9
10
11
testfile
Hello 1
Hello 2
Hello 2
Hello 3
Hello 3
Hello 3
Hello 4
Hello 4
Hello 4
Hello 4

1⃣ 默认无参数

使用uniq 命令可以删除重复的行,不管有多少重复的行,仅仅显示一行。

1
2
3
4
5
$  uniq testfile
Hello 1
Hello 2
Hello 3
Hello 4

2⃣ 统计出现频次

如果希望统计每一行出现的频次,可以使用-c参数,其中第一行输出为出现的次数

1
2
3
4
5
$  uniq -c testfile
1 Hello 1
2 Hello 2
3 Hello 3
4 Hello 4

3⃣ 仅仅显示重复的行

在某些情况下,或许只想看到有重复的列,使用-d参数 :

1
2
3
4
$  uniq -d testfile
Hello 2
Hello 3
Hello 4

4⃣ 仅仅显示不重复的行

而某些情况下,或许只想看到不重复的列,使用-u参数:

1
2
$  uniq -u testfile
Hello 1

Linux which命令

Linux which命令用于查找一个命令,不像findfind是用来查找文件的。

官方定义为:

which - locate a command

改名了会在当前环境变量中查找符合条件的命令。

语法

1
$ which [-a] filename ...

这个命令基本没有参数,只有一个:

  • -a print all matching pathnames of each argument

如果找到相关的指令并可执行,将返回0.

默认无参数

查找命令并显示具体路径:

1
2
$ which bash
/usr/bin/bash

可能会输出不同,取决于环境变量。

显示所有命令

一个命令,可能会有多个版本,或者同一个版本的多个位置,可以使用-a参数来检索。

1
2
3
$ which -a bash
/usr/bin/bash
/bin/bash

一个小小无聊的尝试

Ubuntu操作系统中,看看下面的命令:

1
2
$ which which
which: shell built-in command

显示为内建指令

扩展

如果确认程序或者命令已经安装,但是就是找不到这个命令,如下:

1
2
$ which command
command not found

这个时候就需要确定环境变量的配置PATH,可以通过下面的命令来查看:

1
2
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

此时可以从输出中看到,所确认命令的路径是否在当前环境变量中,如果没有的话,就需要考虑添加进来了。

Linux which命令

Linux which命令用于查找一个命令,不像findfind是用来查找文件的。

官方定义为:

which - locate a command

改名了会在当前环境变量中查找符合条件的命令。

语法

1
$ which [-a] filename ...

这个命令基本没有参数,只有一个:

  • -a print all matching pathnames of each argument

如果找到相关的指令并可执行,将返回0.

1⃣ 默认无参数

查找命令并显示具体路径:

1
2
$ which bash
/usr/bin/bash

可能会输出不同,取决于环境变量。

2⃣ 显示所有命令

一个命令,可能会有多个版本,或者同一个版本的多个位置,可以使用-a参数来检索。

1
2
3
$ which -a bash
/usr/bin/bash
/bin/bash

3⃣ 一个小小无聊的尝试

Ubuntu操作系统中,看看下面的命令:

1
2
$ which which
which: shell built-in command

显示为内建指令

扩展

如果确认程序或者命令已经安装,但是就是找不到这个命令,如下:

1
2
$ which command
command not found

这个时候就需要确定环境变量的配置PATH,可以通过下面的命令来查看:

1
2
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

此时可以从输出中看到,所确认命令的路径是否在当前环境变量中,如果没有的话,就需要考虑添加进来了。