Linux 下 C 语言编程

原创 2004年08月08日 19:20:00

?
 

   前言
Linux的发行版中包含了很多软件开发工具.? 它们中的很多是用于? C? 和? C++应用程序开
发的.? 本文介绍了在? Linux? 下能用于? C? 应用程序开发和调试的工具.? 本文的主旨是介
绍如何在? Linux? 下使用? C? 编译器和其他? C? 编程工具,? 而非? C? 语言编程的教程.? 在本
文中你将学到以下知识:


什么是? C
GNU? C? 编译器
用? gdb? 来调试GCC应用程序
你也能看到随? Linux? 发行的其他有用的? C? 编程工具.? 这些工具包括源程序美化程
序(pretty? print? programs),? 附加的调试工具,? 函数原型自动生成工具(automatic
function? prototypers).

----------------------------------------------------------------------------
----
注意:? 源程序美化程序(pretty? print? programs)自动帮你格式化源代码产生始终如一
的缩进格式.
----------------------------------------------------------------------------
----

什么是? C?
C? 是一种在? UNIX? 操作系统的早期就被广泛使用的通用编程语言.? 它最早是由贝尔
实验室的? Dennis? Ritchie? 为了? UNIX? 的辅助开发而写的,? 开始时? UNIX? 是用汇编语言
和一种叫? B? 的语言编写的.? 从那时候起,? C? 就成为世界上使用最广泛计算机语言.

C? 能在编程领域里得到如此广泛支持的原因有以下一些:
它是一种非常通用的语言.? 几乎你所能想到的任何一种计算机上都有至少一种能用的? C
编译器.? 并且它的语法和函数库在不同的平台上都是统一的,? 这个特性对开发者来说很
有吸引力.
用? C? 写的程序执行速度很快.
C? 是所有版本的UNIX上的系统语言.
C? 在过去的二十年中有了很大的发展.? 在80年代末期美国国家标准协会(American
National? Standards? Institute)发布了一个被称为? ANSI? C? 的? C? 语言标准.这更加保
证了将来在不同平台上的? C? 的一致性.? 在80年代还出现了一种? C? 的面向对象的扩展称
为? C++.? C++? 将在另一篇文章? "C++? 编程"中描述.
Linux? 上可用的? C? 编译器是? GNU? C? 编译器,? 它建立在自由软件基金会的编程许可
证的基础上,? 因此可以自由发布.? 你能在? Linux? 的发行光盘上找到它.

?


GNU? C? 编译器
随? Slackware? Linux? 发行的? GNU? C? 编译器(GCC)是一个全功能的? ANSI? C? 兼容编
译器.? 如果你熟悉其他操作系统或硬件平台上的一种? C? 编译器,? 你将能很快地掌握
GCC.? 本节将介绍如何使用? GCC? 和一些? GCC? 编译器最常用的选项.

使用? GCC
通常后跟一些选项和文件名来使用? GCC? 编译器.? gcc? 命令的基本用法如下:
gcc? [options]? [filenames]
命令行选项指定的操作将在命令行上每个给出的文件上执行.? 下一小节将叙述一些
你会最常用到的选项.

GCC? 选项
GCC? 有超过100个的编译选项可用.? 这些选项中的许多你可能永远都不会用到,? 但
一些主要的选项将会频繁用到.? 很多的? GCC? 选项包括一个以上的字符.? 因此你必须为
每个选项指定各自的连字符,? 并且就象大多数? Linux? 命令一样你不能在一个单独的连
字符后跟一组选项.? 例如,? 下面的两个命令是不同的:
gcc? -p? -g? test.c

gcc? -pg? test.c
第一条命令告诉? GCC? 编译? test.c? 时为? prof? 命令建立剖析(profile)信息并且把
调试信息加入到可执行的文件里.? 第二条命令只告诉? GCC? 为? gprof? 命令建立剖析信息
.

当你不用任何选项编译一个程序时,? GCC? 将会建立(假定编译成功)一个名为? a.out
的可执行文件.? 例如,? 下面的命令将在当前目录下产生一个叫? a.out? 的文件:
gcc? test.c
你能用? -o? 编译选项来为将产生的可执行文件指定一个文件名来代替? a.out.? 例如
,? 将一个叫? count.c? 的? C? 程序编译为名叫? count? 的可执行文件,? 你将输入下面的命
令:
gcc? -o? count? count.c

----------------------------------------------------------------------------
----
注意:? 当你使用? -o? 选项时,? -o? 后面必须跟一个文件名.
----------------------------------------------------------------------------
----

GCC? 同样有指定编译器处理多少的编译选项.? -c? 选项告诉? GCC? 仅把源代码编译为
目标代码而跳过汇编和连接的步骤.? 这个选项使用的非常频繁因为它使得编译多个? C
程序时速度更快并且更易于管理.? 缺省时? GCC? 建立的目标代码文件有一个? .o? 的扩展
名.
-S? 编译选项告诉? GCC? 在为? C? 代码产生了汇编语言文件后停止编译.? GCC? 产生的
汇编语言文件的缺省扩展名是? .s? .? -E? 选项指示编译器仅对输入文件进行预处理.? 当
这个选项被使用时,? 预处理器的输出被送到标准输出而不是储存在文件里.

优? 化? 选? 项
当你用? GCC? 编译? C? 代码时,? 它会试着用最少的时间完成编译并且使编译后的代码
易于调试.? 易于调试意味着编译后的代码与源代码有同样的执行次序,? 编译后的代码没
有经过优化.? 有很多选项可用于告诉? GCC? 在耗费更多编译时间和牺牲易调试性的基础
上产生更小更快的可执行文件.? 这些选项中最典型的是-O? 和? -O2? 选项.
-O? 选项告诉? GCC? 对源代码进行基本优化.? 这些优化在大多数情况下都会使程序执
行的更快.? -O2? 选项告诉? GCC? 产生尽可能小和尽可能快的代码.? -O2? 选项将使编译的
速度比使用? -O? 时慢.? 但通常产生的代码执行速度会更快.

除了? -O? 和? -O2? 优化选项外,? 还有一些低级选项用于产生更快的代码.? 这些选项
非常的特殊,? 而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效
果时再去使用.? 这些选项的详细描述,? 请参考? GCC? 的指南页,? 在命令行上键入? man
gcc? .

调试和剖析选项
GCC? 支持数种调试和剖析选项.? 在这些选项里你会最常用到的是? -g? 和? -pg? 选项.
-g? 选项告诉? GCC? 产生能被? GNU? 调试器使用的调试信息以便调试你的程序.? GCC
提供了一个很多其他? C? 编译器里没有的特性,? 在? GCC? 里你能使? -g? 和? -O? (产生优化
代码)联用.? 这一点非常有用因为你能在与最终产品尽可能相近的情况下调试你的代码.
在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优化时被? GCC? 作了改
动.? 关于调试? C? 程序的更多信息请看下一节"用? gdb? 调试? C? 程序"? .
-pg? 选项告诉? GCC? 在你的程序里加入额外的代码,? 执行时,? 产生? gprof? 用的剖析
信息以显示你的程序的耗时情况.? 关于? gprof? 的更多信息请参考? "gprof"? 一节.

用? gdb? 调试? GCC? 程序
Linux? 包含了一个叫? gdb? 的? GNU? 调试程序.? gdb? 是一个用来调试? C? 和? C++? 程序
的强力调试器.? 它使你能在程序运行时观察程序的内部结构和内存的使用情况.? 以下是
gdb? 所提供的一些功能:
它使你能监视你程序中变量的值.
它使你能设置断点以使程序在指定的代码行上停止执行.
它使你能一行行的执行你的代码.

在命令行上键入? gdb? 并按回车键就可以运行? gdb? 了,? 如果一切正常的话,? gdb? 将
被启动并且你将在屏幕上看到类似的内容:
GDB? is? free? software? and? you? are? welcome? to? distribute? copies? of? it

under? certain? conditions;? type? "show? copying"? to? see? the? conditions.

There? is? absolutely? no? warranty? for? GDB;? type? "show? warranty"? for? details.

GDB? 4.14? (i486-slakware-linux),? Copyright? 1995? Free? Software? Foundation,
Inc.

(gdb)
当你启动? gdb? 后,? 你能在命令行上指定很多的选项.? 你也可以以下面的方式来运
行? gdb? :
gdb?
当你用这种方式运行? gdb? ,? 你能直接指定想要调试的程序.? 这将告诉gdb? 装入名
为? fname? 的可执行文件.? 你也可以用? gdb? 去检查一个因程序异常终止而产生的? core
文件,? 或者与一个正在运行的程序相连.? 你可以参考? gdb? 指南页或在命令行上键入
gdb? -h? 得到一个有关这些选项的说明的简单列表.

为调试编译代码(Compiling? Code? for? Debugging)
为了使? gdb? 正常工作,? 你必须使你的程序在编译时包含调试信息.? 调试信息包含
你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号.? gdb? 利
用这些信息使源代码和机器码相关联.
在编译时用? -g? 选项打开调试选项.


gdb? 基本命令
gdb? 支持很多的命令使你能实现不同的功能.? 这些命令从简单的文件装入到允许
你检查所调用的堆栈内容的复杂命令,? 表27.1列出了你在用? gdb? 调试时会用到的一些
命令.? 想了解? gdb? 的详细使用请参考? gdb? 的指南页.


表? 27.1.? 基本? gdb? 命令.

命? 令? 描? 述
file? 装入想要调试的可执行文件.
kill? 终止正在调试的程序.
list? 列出产生执行文件的源代码的一部分.
next? 执行一行源代码但不进入函数内部.
step? 执行一行源代码而且进入函数内部.
run? 执行当前被调试的程序
quit? 终止? gdb
watch? 使你能监视一个变量的值而不管它何时被改变.
break? 在代码里设置断点,? 这将使程序执行到这里时被挂起.
make? 使你能不退出? gdb? 就可以重新产生可执行文件.
shell? 使你能不离开? gdb? 就执行? UNIX? shell? 命令.

?

gdb? 支持很多与? UNIX? shell? 程序一样的命令编辑特征.? 你能象在? bash? 或? tcsh
里那样按? Tab? 键让? gdb? 帮你补齐一个唯一的命令,? 如果不唯一的话? gdb? 会列出所有
匹配的命令.? 你也能用光标键上下翻动历史命令.

gdb? 应用举例
本节用一个实例教你一步步的用? gdb? 调试程序.? 被调试的程序相当的简单,? 但它
展示了? gdb? 的典型应用.

下面列出了将被调试的程序.? 这个程序被称为? greeting? ,? 它显示一个简单的问候
,? 再用反序将它列出.
#include?

?

main? ()

{

char? my_string[]? =? "hello? there";

?

my_print? (my_string);

my_print2? (my_string);

}

?

void? my_print? (char? *string)

{

printf? ("The? string? is? %s/n",? string);

}

?

void? my_print2? (char? *string)

{

char? *string2;

int? size,? i;

?

size? =? strlen? (string);

string2? =? (char? *)? malloc? (size? +? 1);

for? (i? =? 0;? i? <? size;? i++)

string2[size? -? i]? =? string[i];

string2[size+1]? =? `/0’;

printf? ("The? string? printed? backward? is? %s/n",? string2);

}
用下面的命令编译它:

gcc? -o? test? test.c
这个程序执行时显示如下结果:
The? string? is? hello? there

The? string? printed? backward? is
输出的第一行是正确的,? 但第二行打印出的东西并不是我们所期望的.? 我们所设想
的输出应该是:
The? string? printed? backward? is? ereht? olleh
由于某些原因,? my_print2? 函数没有正常工作.? 让我们用? gdb? 看看问题究竟出在
哪儿,? 先键入如下命令:

gdb? greeting

----------------------------------------------------------------------------
----
注意:? 记得在编译? greeting? 程序时把调试选项打开.
----------------------------------------------------------------------------
----

如果你在输入命令时忘了把要调试的程序作为参数传给? gdb? ,? 你可以在? gdb? 提示
符下用? file? 命令来载入它:

(gdb)? file? greeting
这个命令将载入? greeting? 可执行文件就象你在? gdb? 命令行里装入它一样.
这时你能用? gdb? 的? run? 命令来运行? greeting? 了.? 当它在? gdb? 里被运行后结果
大约会象这样:

(gdb)? run

Starting? program:? /root/greeting

The? string? is? hello? there

The? string? printed? backward? is

Program? exited? with? code? 041
这个输出和在? gdb? 外面运行的结果一样.? 问题是,? 为什么反序打印没有工作?? 为
了找出症结所在,? 我们可以在? my_print2? 函数的? for? 语句后设一个断点,? 具体的做法
是在? gdb? 提示符下键入? list? 命令三次,? 列出源代码:
(gdb)? list

(gdb)? list

(gdb)? list

----------------------------------------------------------------------------
----
技巧:? 在? gdb? 提示符下按回车健将重复上一个命令.
----------------------------------------------------------------------------
----

第一次键入? list? 命令的输出如下:

1? #include?

2

3? main? ()

4? {

5? char? my_string[]? =? "hello? there";

6

7? my_print? (my_string);

8? my_print2? (my_string);

9? }

10
如果按下回车,? gdb? 将再执行一次? list? 命令,? 给出下列输出:

11? my_print? (char? *string)

12? {

13? printf? ("The? string? is? %s/n",? string);

14? }

15

16? my_print2? (char? *string)

17? {

18? char? *string2;

19? int? size,? i;

20
再按一次回车将列出? greeting? 程序的剩余部分:
21? size? =? strlen? (string);

22? string2? =? (char? *)? malloc? (size? +? 1);

23? for? (i? =? 0;? i? <? size;? i++)

24? string2[size? -? i]? =? string[i];

25? string2[size+1]? =? `/0’;

26? printf? ("The? string? printed? backward? is? %s/n",? string2);

27? }
根据列出的源程序,? 你能看到要设断点的地方在第24行,? 在? gdb? 命令行提示符下
键入如下命令设置断点:
(gdb)? break? 24
gdb? 将作出如下的响应:
Breakpoint? 1? at? 0x139:? file? greeting.c,? line? 24

(gdb)

现在再键入? run? 命令,? 将产生如下的输出:

Starting? program:? /root/greeting

The? string? is? hello? there

?

Breakpoint? 1,? my_print2? (string? =? 0xbfffdc4? "hello? there")? at? greeting.c? :24

24? string2[size-i]=string[i]
你能通过设置一个观察? string2[size? -? i]? 变量的值的观察点来看出错误是怎样
产生的,? 做法是键入:

(gdb)? watch? string2[size? -? i]
gdb? 将作出如下回应:
Watchpoint? 2:? string2[size? -? i]
现在可以用? next? 命令来一步步的执行? for? 循环了:

(gdb)? next
经过第一次循环后,? gdb? 告诉我们? string2[size? -? i]? 的值是? `h`.? gdb? 用如下
的显示来告诉你这个信息:

Watchpoint? 2,? string2[size? -? i]

Old? value? =? 0? `/000’

New? value? =? 104? `h’

my_print2(string? =? 0xbfffdc4? "hello? there")? at? greeting.c:23

23? for? (i=0;? i这个值正是期望的.? 后来的数次循环的结果都是正确的.? 当? i=10? 时,? 表达式
string2[size? -? i]? 的值等于? `e`,? size? -? i? 的值等于? 1,? 最后一个字符已经拷到新
串里了.
如果你再把循环执行下去,? 你会看到已经没有值分配给? string2[0]? 了,? 而它是
新串的第一个字符,? 因为? malloc? 函数在分配内存时把它们初始化为空(null)字符.? 所
以? string2? 的第一个字符是空字符.? 这解释了为什么在打印? string2? 时没有任何输出
了.

现在找出了问题出在哪里,? 修正这个错误是很容易的.? 你得把代码里写入? string2
的第一个字符的的偏移量改为? size? -? 1? 而不是? size.? 这是因为? string2? 的大小为
12,? 但起始偏移量是? 0,? 串内的字符从偏移量? 0? 到? 偏移量? 10,? 偏移量? 11? 为空字符
保留.

为了使代码正常工作有很多种修改办法.? 一种是另设一个比串的实际大小小? 1? 的
变量.? 这是这种解决办法的代码:

#include?

?

main? ()


{

char? my_string[]? =? "hello? there";

?

my_print? (my_string);

my_print2? (my_string);

}

?

my_print? (char? *string)

{

printf? ("The? string? is? %s/n",? string);

}

?

my_print2? (char? *string)

{

char? *string2;

int? size,? size2,? i;

?

size? =? strlen? (string);

size2? =? size? -1;

string2? =? (char? *)? malloc? (size? +? 1);

for? (i? =? 0;? i? <? size;? i++)

string2[size2? -? i]? =? string[i];

string2[size]? =? `/0’;

printf? ("The? string? printed? backward? is? %s/n",? string2);

}
另外的? C? 编程工具
Slackware? Linux? 的发行版中还包括一些我们尚未提到的? C? 开发工具.? 本节将介
绍这些工具和它们的典型用法.
xxgdb
xxgdb? 是? gdb? 的一个基于? X? Window? 系统的图形界面.? xxgdb? 包括了命令行版的
gdb? 上的所有特性.? xxgdb? 使你能通过按按钮来执行常用的命令.? 设置了断点的地方
也用图形来显示.

你能在一个? Xterm? 窗口里键入下面的命令来运行它:
xxgdb
你能用? gdb? 里任何有效的命令行选项来初始化? xxgdb? .? 此外? xxgdb? 也有一些特
有的命令行选项,? 表? 27.2? 列出了这些选项.

表? 27.2.? xxgdb? 命令行选项.


选? 项? 描? 述
db_name? 指定所用调试器的名字,? 缺省是? gdb.
db_prompt? 指定调试器提示符,? 缺省为? gdb.
gdbinit? 指定初始化? gdb? 的命令文件的文件名,? 缺省为? .gdbinit.
nx? 告诉? xxgdb? 不执行? .gdbinit? 文件.
bigicon? 使用大图标.

?


calls
你可以在? sunsite.unc.edu? FTP? 站点用下面的路径:
/pub/Linux/devel/lang/c/calls.tar.Z

来取得? calls? ,? 一些旧版本的? Linux? CD-ROM? 发行版里也附带有.? 因为它是一个
有用的工具,? 我们在这里也介绍一下.? 如果你觉得有用的话,? 从? BBS,? FTP,? 或另一张
CD-ROM? 上弄一个拷贝.? calls? 调用? GCC? 的预处理器来处理给出的源程序文件,? 然后
输出这些文件的里的函数调用树图.

?

----------------------------------------------------------------------------
----
注意:? 在你的系统上安装? calls? ,? 以超级用户身份登录后执行下面的步骤:? 1.? 解压和
untar? 文件.? 2.? cd? 进入? calls? untar? 后建立的子目录.? 3.? 把名叫? calls? 的文件移
动到? /usr/bin? 目录.? 4.? 把名叫? calls.1? 的文件移动到目录? /usr/man/man1? .? 5.? 删
除? /tmp/calls? 目录.? 这些步骤将把? calls? 程序和它的指南页安装载你的系统上.
----------------------------------------------------------------------------
----

当? calls? 打印出调用跟踪结果时,? 它在函数后面用中括号给出了函数所在文件的
文件名:
main? [test.c]
如果函数并不是向? calls? 给出的文件里的,? calls? 不知道所调用的函数来自哪里
,? 则只显示函数的名字:
printf
calls? 不对递归和静态函数输出.? 递归函数显示成下面的样子:
fact? <<<? recursive? in? factorial.c? >>>
静态函数象这样显示:
total? [static? in? calculate.c]
作为一个例子,? 假设用? calls? 处理下面的程序:

#include?

?

main? ()

{

char? my_string[]? =? "hello? there";

my_print? (my_string);

my_print2(my_string);

}

?

my_print? (char? *string)

{

printf? ("The? string? is? %s/n",? string);

}

?

my_print2? (char? *string)

{

char? *string2;

int? size,? size2,? i;

?

size? =? strlen? (string);

size2? =? size? -1;

string2? =? (char? *)? malloc? (size? +? 1);

for? (i? =? 0;? i? <? size;? i++)

string2[size2? -? i]? =? string[i];

string2[size]? =? `/0’;

printf? ("The? string? printed? backward? is? %s/n",? string2);

}
将产生如下的输出:
1? main? [test.c]

2? my_print? [test.c]

3? printf

4? my_print2? [test.c]

5? strlen

6? malloc

7? printf
calls? 有很多命令行选项来设置不同的输出格式,? 有关这些选项的更多信息请参考
calls? 的指南页.? 方法是在命令行上键入? calls? -h? .


cproto
cproto? 读入? C? 源程序文件并自动为每个函数产生原型申明.? 用? cproto? 可以在写
程序时为你节省大量用来定义函数原型的时间.
如果你让? cproto? 处理下面的代码:
#include?

?

main? ()

{

char? my_string[]? =? "hello? there";

my_print? (my_string);

my_print2(my_string);

}

?

my_print? (char? *string)

{

printf? ("The? string? is? %s/n",? *string);

}

?

my_print2? (char? *string)

{

char? *string2;

int? size,? size2,? i;

?

size? =? strlen? (string);

size2? =? size? -1;

string2? =? (char? *)? malloc? (size? +? 1);

for? (i? =? 0;? i? <? size;? i++)

string2[size2? -? i]? =? string[i];

string2[size]? =? `/0’;

printf? ("The? string? printed? backward? is? %s/n",? string2);

}
你将得到下面的输出:
/*? test.c? */

int? main(void);

int? my_print(char? *string);

int? my_print2(char? *string);
这个输出可以重定向到一个定义函数原型的包含文件里.
indent
indent? 实用程序是? Linux? 里包含的另一个编程实用工具.? 这个工具简单的说就为
你的代码产生美观的缩进的格式.? indent? 也有很多选项来指定如何格式化你的源代码.
这些选项的更多信息请看indent? 的指南页,? 在命令行上键入? indent? -h? .

下面的例子是? indent? 的缺省输出:

运行? indent? 以前的? C? 代码:

#include?

?

main? ()? {

char? my_string[]? =? "hello? there";

my_print? (my_string);

my_print2(my_string);? }

?

my_print? (char? *string)

{

printf? ("The? string? is? %s/n",? *string);

}

?

my_print2? (char? *string)? {

char? *string2;

int? size,? size2,? i;

?

size? =? strlen? (string);

size2? =? size? -1;

string2? =? (char? *)? malloc? (size? +? 1);

for? (i? =? 0;? i? <? size;? i++)

string2[size2? -? i]? =? string[i];

string2[size]? =? `/0’;


printf? ("The? string? printed? backward? is? %s/n",? string2);

}
运行? indent? 后的? C? 代码:
#include?

?

main? ()

{

char? my_string[]? =? "hello? there";

my_print? (my_string);

my_print2? (my_string);

}

?

my_print? (char? *string)

{

printf? ("The? string? is? %s/n",? *string);

}

?

my_print2? (char? *string)

{

char? *string2;

int? size,? size2,? i;

?

size? =? strlen? (string);

size2? =? size? -1;

string2? =? (char? *)? malloc? (size? +? 1);

for? (i? =? 0;? i? <? size;? i++)

string2[size2? -? i]? =? string[i];

string2[size]? =? `/0’;

printf? ("The? string? printed? backward? is? %s/n",? string2);

}
indent? 并不改变代码的实质内容,? 而只是改变代码的外观.? 使它变得更可读,? 这
永远是一件好事.
gprof
gprof? 是安装在你的? Linux? 系统的? /usr/bin? 目录下的一个程序.? 它使你能剖析
你的程序从而知道程序的哪一个部分在执行时最费时间.
gprof? 将告诉你程序里每个函数被调用的次数和每个函数执行时所占时间的百分比
.? 你如果想提高你的程序性能的话这些信息非常有用.

为了在你的程序上使用? gprof,? 你必须在编译程序时加上? -pg? 选项.? 这将使程序
在每次执行时产生一个叫? gmon.out? 的文件.? gprof? 用这个文件产生剖析信息.

在你运行了你的程序并产生了? gmon.out? 文件后你能用下面的命令获得剖析信息:

gprof?
参数? program_name? 是产生? gmon.out? 文件的程序的名字.

----------------------------------------------------------------------------
----
技巧:? gprof? 产生的剖析数据很大,? 如果你想检查这些数据的话最好把输出重定向到一
个文件里.
----------------------------------------------------------------------------
----

f2c? 和? p2c
f2c? 和? p2c? 是两个源代码转换程序.? f2c? 把? FORTRAN? 代码转换为? C? 代码,? p2c
把? Pascal? 代码转换为? C? 代码.? 当你安装? GCC? 时这两个程序都会被安装上去.
如果你有一些用? FORTRAN? 或? Pascal? 写的代码要用? C? 重写的话,? f2c? 和? p2c? 对
你非常有用.? 这两个程序产生的? C? 代码一般不用修改就直接能被? GCC? 编译.

如果要转换的? FORTRAN? 或? Pascal? 程序比较小的话可以直接使用? f2c? 或? p2c? 不
用加任何选项.? 如果要转换的程序比较庞大,? 包含很多文件的话你可能要用到一些命令
行选项.

在一个? FORTRAN? 程序上使用? f2c? ,? 输入下面的命令:

f2c? my_fortranprog.f

----------------------------------------------------------------------------
----
注意:? f2c? 要求被转换的程序的扩展名为? .f? 或? a? .F? .
----------------------------------------------------------------------------
----

要把一个Pascal? 程序装换为? C? 程序,? 输入下面的命令:
p2c? my_pascalprogram.pas
这两个程序产生的? C? 源代码的文件名都和原来的文件名相同,? 但扩展名由? .f? 或
.pas? 变为? .c.
?

?

linux下C语言编程操作MySQL数据库

在实际应用中,我们不可能在命令行登录进数据库进行数据的查询、插入等操作,用户一般是使用一个界面良好的应用程序软件来对数据进行管理。为了方便应用程序的开发,MySQL提供了多种编程语言(C、perl、p...
  • qq_21111579
  • qq_21111579
  • 2016-07-28 09:55:41
  • 4834

Linux C语言编程-Linux网络通信--Linux上使用curl来发送Http协议的报文---知识点总结+实例d

1.curl是什么,有什么用? 一下是我自己的一些看法: (1)curl是什么或者说cUrl是什么: cURL(C语言上的URL工具可以这样理解吧!) curl是Linux上的一个工具,说白了就是L...
  • PinkBean
  • PinkBean
  • 2016-08-20 13:19:58
  • 3051

linux操作系统下c语言编程入门--Linux下C开发工具介绍

 linux操作系统下c语言编程入门--Linux下C开发工具介绍 Linux的发行版中包含了很多软件开发工具. 它们中的很多是用于 C 和 C++应用程序开发的. 本文介绍了在 Linux 下能用于...
  • byxdaz
  • byxdaz
  • 2007-02-28 18:23:00
  • 9578

linux下TCP Socket编程C语言小实例

几乎是全部按照这个链接上的网址实现的:http://blog.csdn.net/leo115/article/details/8044795   服务器端的代码: #include ...
  • kevin_liu11
  • kevin_liu11
  • 2016-08-24 22:13:30
  • 293

《Linux C编程一站式学习》

  • 2014年08月16日 14:00
  • 8.16MB
  • 下载

c语言之cgi实例

CGI是Common Gateway Interface的缩写,翻译成中文就是通用网关接口,它是网页的后台处理程序,运行在服务器端上,可以用多种语言书写,最常用的就是Perl(因为Perl有强大的字符...
  • liang890319
  • liang890319
  • 2011-03-25 15:09:00
  • 12025

c语言数据库编程--ODBC

c语言数据库编程 转载自:http://www.cnblogs.com/nliao/archive/2010/09/09/1822660.html   最近我的导师要求我用c语言读出acces...
  • it1988888
  • it1988888
  • 2012-09-07 09:55:27
  • 7125

Linux C Socket TCP编程介绍及实例

1、TCP网络编程主要流程 图1.1 注意:图1.1中可以看到close指向read并且标有结束连接的指示,可能有些人会有疑问,这个标注的意思是服务器在处理客户端的时候是循环读取的,如果客户端没有...
  • lell3538
  • lell3538
  • 2016-11-25 15:38:25
  • 3817

Unix和Linux下C语言学习指南

引言   尽管 C 语言问世已近 30 年,但它的魅力仍未减退。C 语言继续吸引着众多的开发者,他们为了编写、移植或维护应用程序而必须学习新技能。   本文是为了满足对C语言初学者或想提高...
  • luo964061873
  • luo964061873
  • 2014-03-01 13:18:46
  • 3409

Linux-(C)网络编程学习socket(初步)

3、TCP、UDP(区别) 3.1、TCP有点 3.1.1、数据可靠、不重复 3.1.2、假如数据块过大(一次发送不出去),那么tcp将会拆分成更小块数据发出去,无需程序员处理 3.2、TCP缺点...
  • qq_33850438
  • qq_33850438
  • 2016-07-28 15:56:35
  • 868
收藏助手
不良信息举报
您举报文章:Linux 下 C 语言编程
举报原因:
原因补充:

(最多只允许输入30个字)