首页 > 编程知识 正文

c++高级编程(c语言嵌入汇编语言)

时间:2023-05-06 09:27:56 阅读:87268 作者:3512

摘要: 使用多个函数的最简单的方法是将它们放在同一个文件中,然后就像编译单个函数的文件一样对该文件进行编译。

UNIX系统

首先,假设在UNIX系统下安装了标准的UNIX C编译器cc。 文件file1.c和文件2.c包含c的函数。 以下命令编译两个文件并生成可执行文件a.out。

c文件1.c文件2.c

它还会生成两个目标文件file1.o和file2.o。 然后,如果只更改了file1.c,而不更改file2.c,则可以使用以下命令编译第一个文件并链接到第二个文件的目标代码:

c文件1.c文件2.o

在UNIX系统下,有自动管理多文件程序的make命令,在此不做详细说明。

LINUX系统

首先,假设在Linux系统上安装了GNU C编译器gcc。 文件file1.c和文件2.c包含c的函数。 以下命令编译两个文件并生成可执行文件a.out。

抄送文件1.c文件2.c

它还会生成两个目标文件file1.o和file2.o。 然后,如果只更改了file1.c,而不更改file2.c,则可以使用以下命令编译第一个文件并链接到第二个文件的目标代码:

抄送文件1.c文件2.o

DOS命令行编译器

大多数DOS命令行编译器的工作方式与UNIX系统的抄送命令相同。

一个区别是,DOS系统中的目标文件扩展名是. obj而不是. o。 有些编译器还会生成汇编语言和其他特殊代码的中间文件,而不是目标代码文件。

windows和Macintosh编译器

Windows和Macintosh系统的编译器是面向工程的。 作业(project )描述特定程序使用的资源。

此资源包含源文件。 如果要使用此编译器运行单个文件程序,则需要创建一个项目。

对于多文件程序,必须使用菜单命令将源文件添加到项目中。 项目还必须包含所有源文件(扩展名为. c的文件)。

但是,头文件不能包含在项目中。 由于项目只管理正在使用的源文件,因此必须通过源文件的#include指令确定使用哪个头文件。

使用头文件

main ) )如果将函数放在第一个文件中,并将自定义函数放在第二个文件中实现,则第一个文件必须使用函数的原型。

如果将函数的原型放置在头文件中,则无需每次使用这些函数时都输入原型声明。 这正是c标准库的做法。 例如,将输入和输出函数的原型声明放入stdio.h中,或将数学函数的原型声明放入math.h中。 包含自定义函数的文件也可以这样做。

在编写程序的过程中,需要使用c的预处理程序定义常数。 定义的常量只能用于包含相应#define语句的文件。 如果程序中的函数位于不同的文件中,则必须使定义常数的#define指令在各个文件中可用。 直接在每个文件中输入命令的方法很耗时,而且容易出错,如果要更改使用#define定义的值,还需要在每个源文件中进行更改,这是一个维护问题。

解决方法是将所有#define指令放在头文件中,然后在每个源文件中使用#include语句引用头文件。

总之,把函数的原型和常数的定义放在头文件里是一个很好的编程习惯。

请考虑这样的例子。 假设需要管理四个连锁的酒店。 每个酒店都有不同的收费标准,但是关于特定的酒店,所有的房间都符合相同的收费标准。 对于预定住宿时间超过1天的人来说,第二天的费用是第一天的95%,第三天的费用是第二天的95%等。 需要能够针对指定的酒店和总住宿天数计算出费用总额的程序。 并且,程序上安装有菜单,用户可以重复数据输入直到选择结束。

程序列表usehotel.c、hotel.c和hotel.h列出了上述程序的源代码。

第一个程序列表包含main ) )函数,通过该函数可以看到整个程序的组织结构。

第二个程序列表包含要使用的函数。 另外,假定这些函数位于另一个文件中。

最后是一个头文件,其中包含用于程序所有源文件的自定义常量和函数原型。 如前所述,在UNIX和DOS环境中,命令#include 'hotels.h '中的双引号表示所包含的文件位于当前目录下。 这个目录通常包含源代码。

程序usehotel.c控制模块

/*usehotel.c --与酒店房间的收费程序*//*程序列表9.10一起编译*

# #包括stdio.h

#include 'hotel.h' /*常数、函数宣言*/

int main (语音) )。

{

整数;

双精度;

int代码;

while ((代码=菜单) )!=QUIT )

交换机(代码)

{ case 1:hotel_rate = HOTEL1; break; case 2:hotel_rate = HOTEL2; break; case 3:hotel_rate = HOTEL3; break; case 4:hotel_rate = HOTEL4; break; default:hotel_rate = 0.0; printf("Oops!n"); break; } nights = getnights(); showprice(hotel_rate,nights); } printf("Thank you and goodbye. "); return 0; }

程序 hotel.c函数支持模块

/*hotel.c --旅馆管理函数*/ #include <stdio.h> #include "hotel.h" int menu(void) { int code,status; printf("n%s$sn",STARS,STARS); printf("Enter the number of the desired hotel: n"); printf("1) Fairfield Arms 2) Hotel Olympicn"); printf("3) Chertworthy Plaza 4) The Stocktonn"); printf("5) quitn"); printf("%s%sn",STARS,STARS); while((status=scanf("%d",&code))!=1 || (code<1 || code>5)) { if(status != 1) scanf("%*s"); /*在scanf()中,把*放在%和说明符之间,它使用函数跳过相应的输入项目*/ printf("Enter an integer from 1 to 5,please.n"); } return code; }int getnights(void){ int nights; printf("How many nights are needed? "); while(scanf("%d",&nights)!=1) { scanf("%*s"); printf("Please enter an integer,such as 2.n"); } return nights; }void showprice(double rate,int nights){ int n; double total = 0.0; double factor = 1.0; for (n=1;n<=nights;n++,factor *= DISCOUNT) total += rate*factor; printf("The total cost will be $%0.2f.n",total); }

程序 hotel.h头文件

/*hotel.h --hotel.c中的常量定义和函数声明*/ #define QUIT 5 #define HOTEL1 80.00 #define HOTEL2 125.00 #define HOTEL3 155.00 #define HOTEL4 200.00 #define DISCOUNT 0.95 #define STARS "******************************" int menu(void); int getnights(void); void showprice(double,int);

顺便提一下,程序中有几处很有特色。比如,函数menu()和getnights()通过检测scanf()的返回值来跳过输入的非数字数据,并且调用scanf("%*s")来跳至下一空白字符。请注意menu()中的以下代码如何检查出非数字的输入和超出范围的数据:

while((status=scanf("%d",&code))!=1 || (code<1 || code>5))

这段代码运用了C的两个运算规则:逻辑表达式从左向右运算;并且一旦结果明显为假,运算会立即停止。在本例中,只有确定scanf()已经成功读取了一个整形数值后, 变量code的数值才会被检测。

用函数分别实现各个独立的功能需要使用这种精练的语句。当然第一次编写menu()和getnights()时可能只使用了简单的scanf()函数而没有数据检查功能。然后,就可以根据基本程序的运行情况对每个模块进行改进。


下节早知道:指针简介。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。