/*
**********************************************************************

INPUT3.C -- Input data parser for EPANET;

VERSION:    2.00
DATE:       5/30/00
            9/7/00
            10/25/00
            3/1/01
            6/24/02
            8/15/07    (2.00.11)
            2/14/08    (2.00.12)
AUTHOR:     L. Rossman
            US EPA - NRMRL

This module parses data from each line of input from file InFile.
All functions in this module are called from newline() in INPUT2.C.
该模块逐行解析INPUT文件。
该模块中的所有函数都在INPUT2.C的newline(int sect, char *line)中被调用。

**********************************************************************
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
#include "hash.h"
#include "text.h"
#include "types.h"
#include "funcs.h"
#define  EXTERN  extern
#include "vars.h"

/* Defined in enumstxt.h in EPANET.C */
extern char *MixTxt[];
extern char *Fldname[];            //字段名称字符串数组

/* Defined in INPUT2.C */
extern char      *Tok[MAXTOKS];    //
extern STmplist  *PrevPat;
extern STmplist  *PrevCurve;
extern int       Ntokens;

...

----------------------------------------------------

http://www.cnblogs.com/KingOfFreedom/admin/EditPosts.aspx?opt=1

extern

在源文件A里定义的函数,在其它源文件里是看不见的(即不能访问)。为了在源文件B里能调用这个函数,应该在B的头部加上一个外部声明:

extern   函数原型;

这样,在源文件B里也可以调用那个函数了。  
  注意这里的用词区别:在A里是定义,在B里是声明。一个函数只能(也必须)在一个源文件里被定义,但是可以在其它多个源文件里被声明。定义引起存储分配,是真正产生那个实体。而声明并不引起存储分配。打一个粗俗的比方:在源文件B里声明后,好比在B里开了一扇窗,让它可以看到A里的那个函数。

  1.extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
  2.如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有区别:
  extern int f(); 和int f();
  ================================
  如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。
  如果你不想包含头文件,那么在c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中调用别的文件定义的函数就不用包含头文件
  include “*.h”来声明函数,声明后直接使用即可。
  ================================
  举个例子:
  //extern.cpp内容如下:
  
  // extern.cpp : Defines the entry point for the console application.
  //
  
  #i nclude "stdafx.h"
  extern print(char *p);
  int main(int argc, char* argv[])
  {
   char *p="hello world!";
   print(p);
   return 0;
  }
  //print.cpp内容如下
  #i nclude "stdafx.h"
  #i nclude "stdio.h"
  print(char *s)
  {
   printf("The string is %s/n",s);
  }
  
  结果程序可以正常运行,输出结果。如果把“extern”去掉,程序依然可以正常运行。
  
  由此可见,“extern”在函数声明中可有可无,只是用来标志该函数在本文件中定义,还是在别的文件中定义。只要你函数在使用之前声明了,那么就可以不用包含头文件了。

C中extern的用法的更多相关文章

  1. C++中extern关键字用法小结

    总结C++中关于extern关键字的用法. 1.变量的生明和定义中 C++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译.为了将程序分为许多文件,则需要在文件中共享代码 ...

  2. extern "c"用法解析

    转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言, ...

  3. 《OOC》笔记(1)——C语言const、static和extern的用法

    <OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...

  4. extern的用法

    extern作为外部函数声明的用法: 1. 可以扩展函数的应用范围: 107.h #ifndef _107H_ #def _107H_ extern void func(); #endif 107.c ...

  5. extern "C" 用法解析

    extern "c"用法解析 作者 作者Jason Ding ,链接http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的 ...

  6. C++中extern “C”含义深层探索

    C++中extern “C”含义深层探索 extern “C” 是一个双向都需要用到的语法表示,就是说在cpp引用c头文件,或者c引用cpp文件时都需要用到.但extern “C” 永远只能在cpp引 ...

  7. 有关extern的用法

    1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言, C++保留了一部分过程式 ...

  8. 变量的声明和定义以及extern的用法

    变量的声明和定义以及extern的用法                                          变量的声明不同于变量的定义,这一点往往容易让人混淆. l         变量 ...

  9. 关于extern的用法

    extern表示该变量或者函数时在另一个地方定义了. 在C++编程中,如果将程序分为多个文件,则需要有在文件间共享代码的方法,这时如果一个变量或者函数需要在多个文件中使用,则可以使用extern来声明 ...

随机推荐

  1. Revit中如何添加水平仰视平面视图

    在Revit平面视图中视角是俯视视角,但是在一些特殊的情况下,我们可能需要创建仰视视角的平面视图,例如我们需要向上看天花板的灯具布置的时候,下面举例说明添加仰视平面视图的方法. 如图在模型中有一楼板跟 ...

  2. Installing Oracle and ArcSDE on separate servers

    http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//002n0000000q000000

  3. A Brief History of Scaling LinkedIn

    原文地址 LinkedIn started in 2003 with the goal of connecting to your network for better job opportuniti ...

  4. Nginx负载均衡深入浅出

    nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以按照轮询.ip哈希.URL哈希.权重等多种方式对后端服务器做负载均 ...

  5. 连上VPN后,如何访问内网(添加路由表实现网络分流方法)

    route add 192.168.4.0 mask 255.255.255.0 192.168.2.0 metric 1 不止有“邮件系统”会出现这种情况,还有其他情况,这时,你需要在没有连接外网和 ...

  6. 文件编辑器 vi

    1.关于文本编辑器: 文本编辑器有很多,比如图形模式的gedit.kwrite.OpenOffice ... ... ,文本模式下的编辑器有vi.vim(vi的增强版本)和nano ... ... v ...

  7. 用户管理 之 Linux 系统中的超级权限的控制

    在Linux操作系统中,root的权限是最高的,也被称为超级权限的拥有者.普通用户无法执行的操作,root用户都能完成,所以也被称之为超级管理用户. 在系统中,每个文件.目录和进程,都归属于某一个用户 ...

  8. Kafka 分区备份实战

    1.概述 在 Kafka 集群中,我们可以对每个 Topic 进行一个或是多个分区,并为该 Topic 指定备份数.这部分元数据信息都是存放在 Zookeeper 上,我们可以使用 zkCli 客户端 ...

  9. TSPL学习笔记(3):排序算法练习

    快速排序 快排的详细介绍见,简单的说就是取输入序列中的首元素m,然后将除首元素m以外的其它元素分成两组,小于等于m的一组和大于m的一组.将3组元素组合成输入队列:小于等于m + m + 大于m. 下面 ...

  10. songtaste网站歌曲真实URL获取

    个人挺喜欢songtaste网站的歌曲的,下载方法也层出不穷,可是作为程序员如果不知其中原理的方法真是羞愧.首先简单点的方法当然有google插件这样的嗅探器了,不过这种工具的原理还不是很了解.今天先 ...