C语言声明与定义

1 前言

本人编写该文章主要是为了顽固已学过的C语言知识。如有错误还请读者指出。

2 声明与定义

(1)C语言属于解释式语言,在使用某种代表特殊含义的标示符运算时,必须使用C语言的关键字声明或定义。使编译器可知该标识符所代表的含义,以便做一些检查转换。
(2)在C语言中(C99标准)声明标识符时,声明可声明多次而编译器不会为其分配存储空间。目的是为了是编译器知道该标识符所代表的含义及原型所在(文件与文件之间)使用关键字extern 修饰变量或函数称为声明(引用)可使同工程目录下的变量或函数实现交互。而定义与前面所说的相反。在定义时编译器会为该标识符分配相应的存储空间。具体分配多少视C语言类型关键字及系统位数而定。函数原型和指针所占空间视系统位数而定。

2.1 变量

(1)C语言在参与运算时,必须用C类型关键字创建一个或多个标识符。在使用该标识符时,编译器会为该标识符分配相应的存储空间。该标识符也称为变量(可变的量)。例程如下所示

void main(void)
{
  int a;   /* 定义a变量 */
  a=123;
  printf("a的值为:%d", a);
}

(2)变量的作用域。在使用变量时该变量的使用范围称为变量的作用域。作用域分为局部变量(作用域只限函数内)与全局变量(作用域只限变量名其后的函数 不加extern 的情况下)。如果局部与全局变量名相同则采用就近原则,优先使用局部变量。例程如下所示

#include <stdio.h>
/*
 ***********************
 * 函数外的变量称为全局变量
 * 函数内的变量称为局部变量
 * 当局部与全局变量名相同时
 * 编译器将用局部变量参与运算
 */
void max(void)
{
 ...
}

int a=5,b=5;  //作用域只限其后函数
int main(void)
{ /* 作用域只限大括号内 */
  int a,b;  //使用该变量
  a=10; b=20;
  {  /* 作用域只限该括号内 */
    int a,b;
     a=15; b=25;
     printf("a=%d,b=%d\n",a,b);   /* 输出 15,25 */
  }
  printf("a=%d,b=%d\n",a,b);  /* 输出 10,20 */
  return 1;
}

(3)变量的声明与定义。
在C语言(C99标准)中全局变量允许同变量名声明多次,可包含extern。局部变量不允许声明,因为作用域只限内部。定义时不论全局或局部变量名只允许定义一次。在定义变量时最好给变量赋予初值,以降低容错率(容易出错的机率)。例程如下所示
定义:多个全局变量名相同时,赋了初值的称为定义。但是未赋值的编译器会自动赋值。也可认为声明=定义
声明:不会分配存储空间全局变量可声明多次
exturn:引用修饰符,引用同工程目录下的文件中的全局变量或同文件下的全局变量。该修饰符也称为声明引用关键字
a.c

#include <stdio.h>
int OvtSit    /* 全局变量 */
int max(void)
{
  ...
  return 1;
}

b.c

#include <stdio.h>
extern int OvtSit;  /* 定义在 a.c */
extern int OviSit;  /* 声明多次 */
int main(void)
{
 int a;    /* 定义a 这里的变量是一个未知的值 */
 int b=0;  /* 降低容错率 */
 return 1;
 
}

2.2 函数

在C语言中函数也有声明与定义。函数声明主要是使编译器知道该函数的一些参数类型(返回值和形参类型)以便编译器做一些类型检查和转换。函数的声明也称为函数原型。编译器会为其分配存储空间。函数定义即程序实现部分。在C语言中程序都是由函数包含起来的,每个函数负责不同的功能实现。因此C语言也称为结构化编程语言。
(1)函数的作用域,函数定义时作用域只限其后函数。声明完其他函数都可已用。加了static只限本文件内使用。外部文件不可访问。
static:静态存储区修饰符。用该修饰符修饰了变量或函数他们不可被外部文件访问。作用域只限文件内
a.c

#include <stdio.h>
/* 作用域只限该文件内 */
static void man(void)
{
  ...
}

b.c

#include <stdio.h>
/* 出错 */
static void man(void);
int main(void)
{
  return 1;
}

(2)函数的声明,在使用某函数时,定义部分不在主调函数的前面和不同文件内需声明函数,可在函数外或内声明,以及在头文件中声明了某函数在使用该函数时需把头文件添加进来。函数声明也被称为函数原型。如下所示
注意:无论有多少个函数且只能有一个主函数
a.h

/* 条件编译 预处理器命令的一种 */
#ifndef __PROTOTYPE_H   /* 未定义该宏则执行其后程序 */
#define __PROTOTYPE_H   /* 直到遇到 #else, #endif */

void max(void);
#endif /* __PROTOTYPE_H */

预处理器命令分为三种:1 包含文件(通常为头文件),2 条件编译如上所示,宏定义(字符串替换及展开)
a.c

#include “a.h”
#include <stdio.h>
void max(void)    /* 不同文件的函数 */
{                 /* 原型在 a.h 文件中 */
  ...
  
}

b.c

#include <stdio.h>
extern void max(void);  /* 不在本文件中需声明引用 */
void man(void);  /* 函数不在主调函数前需声明 */
int main(void)   /* 主调函数 */
{
  man();    /* 调用部分 */
  /* 函数定义部分 */
}

void man(void)   /* 被调函数 */
{
  ...
}

(3)函数的定义,即函数的实现部分(执行某些功能的程序集合)。在主调函数前定义时无需声明该函数原型可直接调用。
注意:函数定义时不予许嵌套定义,即函数内部不允许再定义函数。但是函数之间可以进行嵌套调用相互调用,也可以自己调用自己(递归调用)。不允许其他函数调用主函数

#include <stdio.h>

void max(void);  /* 用到的函数原型 */
void ABC(void);

int main(void)
{
  ...
  max();
  void ABC(void)  /* 不允许在函数内定义 */
  {
    ...
  }
  return 1;
}

void max(void)
{
  ...
  ABC();  /* 嵌套调用 */
}

void ABC(void)
{
  ...
  max();   /* 相互调用 */
  main();  /* 不允许调用主函数 */
}

3 小结

(1)先带读者了解本人编写该文章的目的。
(2)带读者了解变量和函数的声明与定义的区别及作用域。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值