extern

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

extern   函数原型;

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

#i nclude "stdafx.h"

  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”在函数声明中可有可无,只是用来标志该函数在本文件中定义,还是在别的文件中定义。只要你函数在使用之前声明了,那么就可以不用包含头文件了。
  
    VC++6.0中常出现的"unexpected end of file while looking for precompiled header directive"的问题?

如何解决:"fatal error C1010:VC++6.0中常出现的"unexpected end of file while looking for precompiled header directive"的问题?

我想大家在VC6.0中经常回遇到这样的问题,如何解决呢?

1、看看是否缺少“;”,“}”   
 如:类,结构体后面的分号
 隐藏得深的是宏、.h文件的问题就要费点心思了

2、一定是你在类的部分定义被删除了,M$在每个类中定义一些特殊的常量,是成对的,如下: 
 .h: 
 #if !defined(AFX_CHILDFRM_H__54CA89DD_BA94_11D4_94D7_0010B503C2EA__INCLUDED_) 
 #define AFX_CHILDFRM_H__54CA89DD_BA94_11D4_94D7_0010B503C2EA__INCLUDED_ 
 ....... 
 //{{AFX_INSERT_LOCATION}} 
 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MAINFRM_H__54CA89DB_BA94_11D4_94D7_0010B503C2EA__INCLUDED_)

你可以新建一个类,然后把这些拷贝过去或补上就可以了。   
 3、在头部加入 #i nclude "stdafx.h"

4、在CPP文件第一行加上#i nclude "stdafx.h"。 
 或者Rebuild All.

5、

(1). [Project] - [Settings] - [C/C++] - [Category] 
 (2). 选择 [Precomplied Headers]
 (3). 单选 [Not Using Precomplied Headers]
 (4). [OK]

如果以上不能解决问题,那么就请看以下内容.引起这样的错误,有可能你只是增加了一个.H和.CPP的文件.这时你就要按上面所说.
名含"stdafx.h"即可.如果还要在多个文件里同时使用结构类型,你就要继续向下看了.一定会有不少收获的.

类型的定义和类型变量的定义不同, 
 类型定义只是描述一个类型, 
 是给编译器看的, 
 不会产生可执行代码。 
 变量定义是指在执行文件中真实得存在这么一块内容。

因为每个.c里都要写清楚类型定义很麻烦, 
 所以一般都把类型定义写在.h里 
 ,而在.c里采用简单的写法,如struct A a; 
 这样定义变量, 
 不需把整个类型的描述再写一遍。

------------------------------------------------------------------------ 
 所以,struct类型定义放到 XX.h里面, 
 XX.cpp 里加struct str st_r; 
 XXXXX.cpp加上#i nclude "XX.h" 
 然后直接使用extern struct str st_r;

extern使用方法总结!(转)的更多相关文章

  1. extern 使用方法具体解释

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的.要在此处引用".(extern能够置于变量或者函数前,以标示变量或者函数的定义在别的文 ...

  2. extern外部方法使用C#简单样例

    外部方法使用C#简单样例 1.添加引用using System.Runtime.InteropServices; 2.声明和实现的连接[DllImport("kernel32", ...

  3. 深入理解extern使用方法

    一. extern做变量声明 l  声明externkeyword的全局变量和函数可以使得它们可以跨文件被訪问. 我们一般把全部的全局变量和全局函数的实现都放在一个*.cpp文件中面,然后用一个同名的 ...

  4. 类属性"get"必须声明主体,因为它未标记为 abstract 或 extern[解决方法]

    当在页面cs文件中,写类属性时,运行会碰到以下问题:CS0501: “ASP.default_aspx.Person.Level.get”必须声明主体,因为它未标记为 abstract 或 exter ...

  5. extern外部方法使用C#简单例子

    外部方法使用C#简单例子 1.增加引用using System.Runtime.InteropServices; 2.声明和实现的连接[DllImport("kernel32", ...

  6. 结构体变量的 extern 使用方法,转--

    要求如下,在.h文件中这样定义: typedef struct typFNT_GB16     // 汉字字模数据结构 {     signed ];        // 汉字内码索引     ]; ...

  7. 都是用 DllImport?有没有考虑过自己写一个 extern 方法?

    你做 .NET 开发的时候,一定用过 DllImport 这个特性吧,这货是用于 P/Invoke (Platform Invoke, 平台调用) 的.这种 DllImport 标记的方法都带有一个 ...

  8. C#调用windows API的一些方法

    使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2. ...

  9. C/C++中extern和static

    目录 1 extern概念 2 extern作用 2.1 变量声明 2.2 变量定义 2.3 声明和定义举例 3 为什么使用extern 4 怎么使用extern 4.1 基本数据类型定义变量 4.2 ...

随机推荐

  1. Java实现MD5加密解密类

    http://blog.csdn.net/m_changgong/article/details/4361526

  2. Kotlin基本语法笔记3之定义类、继承及创建实例

    定义类 class MyObject private constructor(name: String, age: Int) { private var name: String private va ...

  3. java内存泄露具体解释

    非常多人有疑问,java有非常好的垃圾回收机制,怎么会有内存泄露?事实上是有的,那么何为内存泄露?在Java中所谓内存泄露就是指在程序执行的过程中产生了一些对象,当不须要这些对象时,他们却没有被垃圾回 ...

  4. 自定义fragmentlayout

    一.抽取视图文件,实例化需要在xml文件中 先上效果图: 1.  编写 xml布局文件 <?xml version="1.0" encoding="utf-8&qu ...

  5. ThinkPHP使用方法与心得

    ThinkPHP相信PHP程序员对它并不陌生,通过自己的学习在此发表个人看法,也为以后自己查找ThinkPHP方面的知识更加方便. 一.mvc及数据库CURD操作流程: 1.新建数据库:数据库名称:1 ...

  6. hihocoder #1122 二分图二•二分图最大匹配之匈牙利算法(*【模板】应用 )

    梳理整个算法: 1. 依次枚举每一个点i: 2. 若点i尚未匹配,则以此点为起点查询一次交错路径. 最后即可得到最大匹配数. 在这个基础上仍然有两个可以优化的地方: 1.对于点的枚举:当我们枚举了所有 ...

  7. 专网IP和公网IP的区别是什么

    专网ip是自己网内用,公网的话就全球有效 最大区别是公网IP世界只有一个,私网IP可以重复,但是在一个局域网内不能重复 访问互联网是需要IP地址的,IP地址又分为公网IP和私网IP,访问互联网需要公网 ...

  8. Oracle在Java中事物管理

    对于 对数据库中的数据做dml操作时,能够回滚,这一事物是很重要的 下面例子是对数据库中数据进行修改 package com.demo.oracle; import java.sql.Connecti ...

  9. 20171202作业1python入门

    1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型 编译型:需要编译器,执行前一次性翻译成机器能读懂的代码(如c,c++,执行速度快,调试麻烦) 解释型:需要解释器 ...

  10. tensorflow sigmoid_cross_entropy_with_logits 函数解释

    tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None) sigmoid_ ...