注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.Right

不顾一切的去想,于是我们有了梦想。脚踏实地的去做,于是梦想成了现实。

 
 
 

日志

 
 
关于我

人生一年又一年,只要每年都有所积累,有所成长,都有那么一次自己认为满意的花开时刻就好。即使一时不顺,也要敞开胸怀。生命的荣枯并不是简单的重复,一时的得失不是成败的尺度。花开不是荣耀,而是一个美丽的结束,花谢也不是耻辱,而是一个低调的开始。

网易考拉推荐

阿英讲C语言extern外部变量,外部函数使用  

2013-02-19 23:12:29|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

即以此功德,庄严佛净土。上报四重恩,下济三途苦。惟愿见闻者,悉发菩提心。在世富贵全,往生极乐国。

子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢?

答:
子程序不要定义在.h中。
函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误。


.h 中应该都是一些宏定义和变量、函数声明,告诉别人你的程序“能干什么、该怎么用”
.c 中是所有变量和函数的定义,告诉计算机你的程序“该怎么实现”


1. 看看C语言中头文件header file怎么使用

// main.h


#ifndef MAIN_H_INCLUDED

#define MAIN_H_INCLUDED


#include <stdio.h>

int my_var;  // 头文件中定义的变量

 void print_value()   // 正规的C代码 不要把函数的实现放在.h文件中!

 {

    printf("my_var = %d\n", my_var);

 }


#endif // MAIN_H_INCLUDED


//main.c

#include "main.h"   //  #include 完全等价 于把 .h 文件 Ctrl-C Ctrl-V 到 .c 中

int main()

{

 // extern int my_var;


  my_var = 500;  // 头文件中定义的变量 

  print_value();

  exit (0);

}


?// 编译器看到的完整代码

#include <stdio.h>


  int my_var;  // 全局变量声明,可放入.h文件中

void print_value(); // 全局函数声明,可放入.h文件中


int main()

{

  print_value(); // 看看不用#include"secondary.c"都可正常调用里面的函数!!!


   my_var = 7;

  printf("my_var variable: %d\n", my_var++);

  printf("my_var variable: %d\n", my_var++);

  return (0);

}


 void print_value()

 {

    printf("my_var = %d\n", my_var);

 }



2. 看看C语言中extern变量怎么使用---原理

//secondary.c

#include <stdio.h>

int my_var;

 void print_value()

 {

    printf("my_var = %d\n", my_var);

 }


//main.c

//#include "main.h"

int main()

{

  extern int my_var;   // 相当于delphi中 uses unit1,   而my_var: integer在 unit1.pas文件中定义


  my_var = 500;

  print_value();

  return (0);

}

type the command gcc -o testprog main.c secondary.c, and run the program with ./testprog


3. C语言中extern变量的规范用法---实际项目中推荐

//secondary.h


#ifndef TERTIARY_H_INCLUDED

#define TERTIARY_H_INCLUDED


extern int my_var;  // 对外部变量的extern声明, 这可是全局变量

// C语言中声明print_value()的目的是对其他.c文件中实现的函数进行汇总以方便后期审核, 注释掉此行程序完全能运行;

void print_value(); // 对全局函数进行声明


#endif // TERTIARY_H_INCLUDED



/*

Guidelines


Rules to be broken by experts only, and only with good reason:


1. A header file only contains extern declarations of variables - never static or unqualified variable definitions.

2. For any given variable, only one header file declares it (SPOT - Single Point of Truth).

3. A source file never contains extern declarations of variables - source files always include the (sole) header that declares them.

4. For any given variable, exactly one source file defines the variable, preferably initializing it too. (Although there is no need to initialize explicitly to zero, it does no harm and can do some good, because there can be only one initialized definition of a particular global variable in a program).

5. The source file that defines the variable also includes the header to ensure that the definition and the declaration are consistent.

6. A function should never need to declare a variable using extern.

7. Avoid global variables whenever possible - use functions instead.

*/


// secondary.c

// 我以前没看出来在main函数体之外定义的函数和变量都是全局的!

#include <stdio.h>

int my_var = 777;

 void print_value()   // static void print_value() 将使main.c无法使用

 {

    printf("my_var = %d\n", my_var);

 }


//main.c

#include "secondary.h"

int main()

{

  print_value(); // 看看不用#include"secondary.c"都可正常调用里面的函数!!!, 这说明其他文件中的函数没有被static修饰都是可以被本project中其他文件直接调用的!


  my_var = 500;

  printf("my_var variable: %d\n", my_var++);

  printf("my_var variable: %d\n", my_var++);

  return (0);

}

 
  评论这张
 
阅读(531)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016