c语言3种链接属性: 外部(external), 内部(internal),无设置(none)

c语言中,多个文件组合的时候,有可能标示名相同,那么这个时候编译器如何判别的呢?
c语言中有3种链接属性: 外部(external:可以被其他文件访问到), 内部(internal:无法被其他文件访问到),无设置(none)
    外部(external):使用extern关键字
    内部internal ):使用static关键字
   

小结一下:

1.extern的修饰的符号,必须在工程的其他文件中要有一个变量的定义,否则不能被使用。

2.extern使用之后可是实现全部工程的不同文件使用相同的变量

3.internal的属性方式,通过static来进行修饰仅仅是在改文件中可以使用,但是在其他的文件中则不能访问。




 对各种情况进行一些测试吧
 第一步测试,在两个文件中定义相同名称的变量
    unit1.c
    --------------------
int a = 10;
void printtest1()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}

    unit2.c
 -------------------
int a = 20;
void printtest2()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}

    main.c
 ------------------
void printtest1();
void printtest1();
int main(int argc, char *argv[])
{
 printtest1();
 printtest2();
 system("PAUSE"); 
 return 0;
}
   编译时提示错误 unit2.c multiple definition of 'a' ,由于unit1.c和unit2.c都定义了a
   第一步测试结论:如果在不同的文件中定义相同名字的变量,编译器无法通过编译
============================================================================================ 
   第二步测试,把其中一个声明改成extern 
   这个时候把unit2.c改造一下
extern int a;
void printtest2()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}
   unit2中使用extern标示该变量是外部链接的, 这样编译通过了,结果显示unit1和unit2中a的值都为10,OK,值相同了,那么真的是同一个变量了吗,修改一下值再确认一下
   改造一下main.c,修改a的值
extern int a;
a = 20;
printtest1();
printtest2();
a = 30;
printtest1();
printtest2();
 这个时候输出为
 unit1.c   20
 unit2.c   20
 unit1.c   30
 unit2.c   30
 可以确认的确是使用了同一个变量了。
 第二步测试结论;使用extern可以访问其他文件中定义的变量
 ============================================================================================ 
 第三步测试把其中一个声明使用static标示
 首先在unit1.c这把a声明成static,个时候编译器提示main.c和unit2.c中的a未定义,static把unit1.c中的a定义为文件内部使用范围,unit2.c和main.c中无法访问到该变量。
 把uint2.c中的声明修改成int a;
 这个时候输出为
 unit1.c   10
 unit2.c   20
 unit1.c   10
 unit2.c   30
    OK,结果显示unit1.c中的a和unit2.c中的a互相不影响了。再测试一下,在unit1.c中使用extern int a,看看能不能引用到unit2.c中的变量
void printtest1()
{
 extern int a;
 a = 10;
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}
    这个时候输出为
 unit1.c   10
 unit2.c   20
 unit1.c   10
 unit2.c   30
    可以确认unit1.c中使用的a都是本文件内定义的变量,无法影响到unit2.c中的变量了。
 第三步测试结论:使用static标示的变量在文件内部有效,其他文件中无法访问。并且在该文件中无法引用到其他文件的同名称变量
 ============================================================================================ 
 第四步测试,两个文件都设置成extern
 如果在unit1.c和unit2.c中都申明成extern会怎么样呢?
    unit1.c
    --------------------
extern int a;
void printtest1()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}

    unit2.c
 -------------------
exntern int a;
void printtest2()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}
 这个时候所有使用a的地方都报编译错误,提示没有定义变量。
 第四步测试结论:使用extern标示的变量必须已经定义过。
 ============================================================================================ 
 第五步,测试static标示的函数
 把unit1.c中的printtest1修改成static
 static void printtest1()
 这时编译器报错,main.c中使用的printtest1未定义。
 第5步测试结论:使用static标示的函数,在其他文件中不能访问。
 ============================================================================================ 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 数组习题

2.写一个函数,返回一个整数数组的平均值 package com.fxm.day05.test; public class Day05test{public static void main(String[] args){int[] a1 {2,9,5,7,4};int n average(a1);System.out.println(n);}public static int average(int[] a){int sum 0;for(in…

机器学习笔记(1):Introduction

目录 1)welcome 2)What is Machine Learning 3)Supervised Learning 4)Unsupervised Learning 1)welcome 第一个视频主要介绍了机器学习目前的案例,主要有:数据库挖掘、医疗记录、生物工程…

【POJ - 3352】Road Construction(Tarjan,边双连通分量)

题干: Its almost summer time, and that means that its almost summer construction time! This year, the good people who are in charge of the roads on the tropical island paradise of Remote Island would like to repair and upgrade the various roads…

C++匿名命名空间

当定义一个命名空间时,可以忽略这个命名空间的名称: namespce {char c;int i;double d;}编译器在内部会为这个命名空间生成一个唯一的名字,而且还会为这个匿名的命名空间生成一条using指令。所以上面的代码在效果上等同于:namespa…

机器学习简易入门-附推荐学习资料

目录 (1)机器学习正规学习路线 (2)机器学习快速入门 (3)总结 感谢黄海广博士的分享 原创: 机器学习初学者 机器学习初学者 今天 机器学习如何入门?目前没有明确的答案。本站面向…

python 习题

使用蒙特-卡罗方法计算圆周率近似值 蒙特-卡罗方法是一种通过概率来得到问题近似解的方法。假设又一块边长为2的正方形木板,上面画一个单位圆,然后随意往木板上扔飞镖,落点坐标(x,y)必然在木板上(更多的是落在单位圆内),如果扔的…

C++11中的std::function

原文地址&#xff1a;http://www.jellythink.com/archives/771 看看这段代码 先来看看下面这两行代码&#xff1a; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased; 这两…

【HDU - 3394】Railway(点双连通分量,Tarjan算法,思维tricks)

题干&#xff1a; There are some locations in a park, and some of them are connected by roads. The park manger needs to build some railways along the roads, and he would like to arrange tourist routes to each circuit. If a railway belongs to more than one …

飞机大战(简易版)

一、游戏分析 飞机大战中的主要“角色”有&#xff1a; 1.英雄 2.敌方飞机 3.英雄发射的子弹 我们需要控制的有&#xff1a; 1.绘制屏幕内的角色 2.控制角色的逻辑&#xff0c;比如&#xff1a;敌方飞机与我方飞机的碰撞检测&#xff0c;我方飞机发射的子弹与敌方飞机之间的碰撞…

在Ubuntu上安装Keras深度学习框架

目录 1&#xff09;安装pip 2&#xff09;安装Python科学套件 3&#xff09;安装TensorFlow 4&#xff09;安装keras 5&#xff09;安装Jupyter Notebook 6&#xff09;运行Keras 本文介绍如何在Ubuntu上安装Keras深度学习框架。 1&#xff09;安装pip 安装pip包&#…

【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)

题干&#xff1a; Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a failure of a single node, 3, in the network on the left would prevent some of the still…

C++11 FAQ中文版:std::function 和 std::bind

std::function 和 std::bind 标准库函数bind()和function()定义于头文件中&#xff08;该头文件还包括许多其他函数对象&#xff09;&#xff0c;用于处理函数及函数参数。bind()接受一个函数&#xff08;或者函数对象&#xff0c;或者任何你可以通过”(…)”符号调用的事物&am…

Java 习题(面向对象)

1.&#xff08;面向对象基础&#xff09;写一个Worker 类&#xff0c;并创建多个Worker 对象。 为Worker 类添加四个属性&#xff0c; <1>int 类型的id&#xff0c;表示工人的编号&#xff1b; <2>String 类型的name&#xff0c;表示工人的姓名&#xff1b; <3…

机器学习笔记(2):单变量线性回归

目录 1&#xff09;Model representation 2&#xff09;Cost function 3&#xff09;Cost function intuition 1 4&#xff09;Cost function intuition2 5&#xff09;Gradient descent 6&#xff09;Gradient descent intuition 7&#xff09;Gradient descent for li…

指针右左法则----复杂指针解析

其实如果写得出&#xff08;其实不难&#xff09;指针和数组的声明的EBNF的话&#xff0c;那么直接看就可以反应过来了…… 右左法则是一个既著名又常用的方法。不过&#xff0c;右左法则其实并不是C标准里面的内容&#xff0c;它是从C标准的声明规定中归纳出来的方法。C标准的…

【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)

题干&#xff1a; 网络管理员管理大型网络。该网络由N台计算机和成对计算机之间的M链路组成。任何一对计算机都通过连续的链接直接或间接连接&#xff0c;因此可以在任何两台计算机之间转换数据。管理员发现某些链接对网络至关重要&#xff0c;因为任何一个链接的故障都可能导…

安装VMware tools

点击“虚拟机” 安装VMware tools提取图中文件到“下载” 提取登入root 进入 cd 下载/vmware-tools-distrib 执行 ./vmware-install-pl 输入yes或者点击“enter”出现图中&#xff0c;即为成功安装

Keras入门实战(1):MNIST手写数字分类

目录 1)首先我们加载Keras中的数据集 2&#xff09;网络架构 3&#xff09;选择编译(compile参数) 4&#xff09;准备图像数据 5) 训练模型 6&#xff09;测试数据 前面的博客中已经介绍了如何在Ubuntu下安装Keras深度学习框架。 现在我们使用 Keras 库来学习手写数字分…

什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF

什么是BNF范式,什么又是EBNF范式? 巴科斯范式及其扩展 BNF & Augmented BNF 什么是巴科斯范式&#xff1f;   巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。   现在&…

root 进入ssh 出现问题

用root输入下面命令&#xff0c;一直让输入密码&#xff0c;并提示错误 ssh localhost那是因为系统默认禁止root用户登录ssh 首先&#xff0c;CtrlC退出密码输入界面&#xff1a;然后输入&#xff1a;su - 然后&#xff0c;编辑sshd_config文件&#xff0c;输入&#xff1a;…