集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1440|回复: 1

水滴石穿C语言之编译器引出的问题

[复制链接]
zxopen88 发表于 2012-6-9 16:47:17 | 显示全部楼层 |阅读模式
本节主要探讨C编译器下面两方面的特点所引发的一系列常见的编程问题。

    对C文件进行分别编译:
    C程序通常由几个小程序(.c文件)组成,编译器将这几个小程序分别编译,然后通过链接程序将它们组合在一起形成一个目标代码。由于编译器每次只能编译一个文件,因此它不能立即检查需要几个源文件配合才能发现的错误。

    对函数的参数和返回值建立临时变量
    C编译器会对函数的参数建立临时参数,也可能会对函数的返回值隐含传递一个指针。因为这些临时变量的隐含性存在,使得在某些情况下,特别是有指针存在的时候,会引发一系列的问题。

    C文件中所包含的头文件会和C语言一同编译

    C语言中被包含的头文件是和.c文件一起编译的,头文件中的问题会反映到.c文件的编译中。

  问题:C文件的分别编译

  我有一个数组a定义在f1.c中,但是我想在f2.c中计算它的元素个数,用sizeof可以达到这个目的吗?

   答案与分析:

  答案是否定的,你没有办法达到目的,本质原因是sizeof操作符只是在“编译时(compile time)”起作用,而C语言的编译单位是每次单个.c文件进行编译(其它语言也都如此)。因此,sizeof可以确定同一个源文件中某个数组的大小,但是对于定义在另一个源文件中的数组它无能为力了,因为那已经是“运行时(run time)”才能确定的事情了。

  一件事情要想做,总会有办法的,下面提供有三种可选的办法来解决这个问题:

  1)、定义一个全局变量,让它记住数组的大小,在另外一个.c文件中我们通过访问这个全局变量来得到数组的大小信息(好像有点小题大做得不偿失^_^)。

  2)、在某个.h文件中用宏定义数组的大小,例如#define ARRAY_SIZE 50,然后在两个源文件中都包含这个.h文件,通过直接访问ARRAY_SIZE来得到定义在不同.c文件中的数组的大小。

  3)、设置数组的最后一个元素为特殊值,例如0,-1,NULL等,然后我们通过遍历数组来寻找这个特殊的结尾元素,从而判断数组的长度(这个办法效率低,也是笨笨的)。

   问题:函数返回值隐含传递指针

  下面的代码可以正常工作,但是在程序结束时会有一个致命错误产生。究竟是什么原因呢?  strUCt list
{
 char *item;
 struct list *next;
}

main (argc, argv)
{
 ...
}
    答案与分析:

  原因很简单,稍微注意一点不难发现,在定义结构list的右花括弧后面加一个分号就可以解决这个问题:
struct list
{
 char *item;
 struct list *next;
};//缺了这个分号可不行!
好了,问题是解决了,但,你知道这个错误究竟导致了什么致命问题吗?问题不是表面上那么简单的,OK,让我们来看看事情背后的真相。

  首先看一看下面这段代码:
VOID Func ( struct my_struct stX)
{
 .......
}
struct my_struct stY = {...};
Func (stY);

当调用函数Func的时候,是把结构变量stY的值拷贝一份到调用栈中,从而作为参数传递给函数FUNC的,这个叫做C语言的参数值传递。我相信这个你一定很清楚,那么,你应该知道:如果函数的返回值是结构变量的话,函数应该如何将值返回给调用者呢?且看下面这段代码:
fpga_feixiang 发表于 2022-4-20 19:21:27 | 显示全部楼层
6666666666666666666
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-16 04:49 , Processed in 0.203169 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表