社区
C语言
帖子详情
请问static 和 extern 的区别
zj_zyq
2002-02-25 05:51:57
请问static 和 extern 的区别
例
//example.h
int a;
extern int b;
////
Ctrl F5;
Error Link ... example.obj; why
static int c;
void AA()
{
c++;
cout<<c;
}
void main
{
AA();
c++;
cout<<c;
}
output
11 Why
...全文
422
13
打赏
收藏
请问static 和 extern 的区别
请问static 和 extern 的区别 例 //example.h int a; extern int b; //// Ctrl F5; Error Link ... example.obj; why static int c; void AA() { c++; cout<<c; } void main { AA(); c++; cout<<c; } output 11 Why
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zj_zyq
2002-02-27
打赏
举报
回复
在《MFC深入浅出》中
//mfc.h
//mfc.cpp
extern CWinApp theapp;
//my.h
//my.cpp
CWinApp theapp;
void main()
{
CWinApp* APP=GetApp();
...
}
}
1\
extern CWinApp theapp;//为什么不放在 mfc.h中声明
2、
CWinApp theapp;//难道不是重复声明吗,或有其他含义吗
zj_zyq
2002-02-27
打赏
举报
回复
1、
// wnd.h
int a;
extern int b;
static c;
会出现Errof Link *.obj Why; 针对int a; extern int b;出错
// wnd.cpp
LERESULT CALLBACK WndProc(...)
{
...
case WM_PAINT:
c=1;
return 0;
...
}
///////////////
2、
//myprogram.h
#include *.h
//myprogram.cpp
bool CALLBACK DlgProc(...)
{
...
case WM_PAINT:
output(c);//输出C
return 0;
...
}
结果有时是1,有时是0,Why
sdmity
2002-02-27
打赏
举报
回复
extern CWinApp theapp 不是变量定义,CWinApp theapp才是,它只是在这个文件(mfc.cpp)中对在别的文件中定义的变量(my.cpp)的引用,不放在mfc.h中是因为并不是所有用到mfc.h的文件都需要这个变量。所以,CWinApp theapp不是重复声明。
Last_Dodo
2002-02-26
打赏
举报
回复
extern只能用来修饰变量/函数的声明(declaration)。它的意思是:变量/函数已经定义,我要用它。此变量/函数可以是别的模块(module)定义的,也可以是当前模块定义的。它修饰的变量不一定是全局变量但若是别的模块定义的,它必定是全局变量而且不是静态(static)全局变量。若修饰的是函数,当前文件内不能有同名函数(有些编译器允许有同名函数但它必须是静态即static而且extern指的总是这静态函数)。
下面的例子可帮助理解:
In a.C:
#include <iostream.h>
int i = 100;
void foo()
{
cerr << "In a.C foo()\n";
}
In main.C:
#include <iostream.h>
extern int i;
void test()
{
cerr << i << endl; //i自然是100
extern void foo();
foo(); //哪个foo()?
}
static void foo() //有些编译器允许
{
cerr << "In b.C foo()\n";
}
int main()
{
int i = 0;
extern int i;
cerr << i << endl; //哪个i?
{
extern int i;
cerr << i << endl; //现在又是哪个i?
}
test();
extern void foo();
foo(); //哪个foo?
}
static修饰变量时,既可以修饰变量的定义(definition)也可以修饰变量的声明。
static int i; //如果是在类里,修饰的是声明。如果是在类外修饰的是定义。
static还可以用来修饰函数的声明或定义。
static void foo(); //修饰的是函数声明。
static void foo() //修饰的是函数定义
{
...
}
它的意思是:
1。如果在类里,修饰的变量/函数是类变量/函数。
2。如果在类外,修饰的变量/函数可见范围(scope)是整个文件内部,即其它模块是不能通过extern来调用它。
masterjames
2002-02-26
打赏
举报
回复
一个是静态,一个是全局,
静态应该用静态函数来访问。
全局都可以访问
zheng_can
2002-02-25
打赏
举报
回复
就你的程序来讲
在声明好 static int c 后,应该给它赋以初值(0),否则打印出任何数都是有可能的
zosatapo
2002-02-25
打赏
举报
回复
基本同意: hezh() 的观点。
static和extern都被称为"global"变量(或者函数)。
但是他们的生存周期和可见性是不同。static是文件级,
只有程序文件之间显式的包含才可以引用(主要就是使用#include)
但是extern是程序级的,你不必显式的引用文件的,但需要使用extern
存储空间修饰符,这个任务编译器,链接器帮你完成了。
可以参考一下下面的文章。
http://www.csdn.net/Develop/read_article.asp?id=12545
http://www.csdn.net/Develop/read_article.asp?id=12539
Witty
2002-02-25
打赏
举报
回复
static 声明需要初始化?
结合你的要求,给你一个例子
// TEST.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "h.h"
#include "iostream.h"
static int c;
extern int h;
void AA()
{
c++;
cout<<c;
}
int main(int argc, char* argv[])
{
AA();
c++;
cout<<c<<endl;
cout<<h<<endl;
return 0;
}
/*
* h.h
*/
int h ;
///////////
output:
12
0
//////////
对变量而言,static声明或定义一个静态变量
而extern 是引用已经声明的变量
wolfboy
2002-02-25
打赏
举报
回复
哦,说错了,对变量而言,static将声明或定义一个静态变量
extem外部声明或定义
wolfboy
2002-02-25
打赏
举报
回复
对函数而言,static将函数申明为局部函数,
对变量而言,则相反
Behard
2002-02-25
打赏
举报
回复
static:在程序的数据区
extern:是在不同的*.c/*.cpp 文件中的,只能定义一次,别的只是引用
hezh
2002-02-25
打赏
举报
回复
static 是文件级的,必须初始化,extem外部声明或定义!两个不同的概念
garfield_82
2002-02-25
打赏
举报
回复
我记得,static的作用域是整个文件范围,extern是多个文件之间。
西门子S7-1200数据块DB实战:从创建到优化的完整指南
本文提供西门子S7-1200数据块(DB)从创建到优化的完整实战指南。详细解析了全局DB与背景DB的核心
区别
、优化块访问的优势,并深入探讨了变量定义、数据结构设计、数据保持性设置及高级应用技巧,帮助工程师构建清晰、高效且易于维护的PLC程序架构。
西门子S7-1200 PLC间S7通讯配置与调试实战指南
工业自动化系统中,PLC(可编程逻辑控制器)间的数据交换是实现设备协同与集中控制的核心需求。在西门子TIA Portal生态下,S7通讯协议作为一种专有、高效的解决方案,其原理在于通过ISO-on-TCP协议提供面向连接的块数据访问,屏蔽了底层网络报文解析的复杂性。该技术的核心价值在于显著提升开发效率与系统可靠性,工程师无需处理繁琐的套接字编程与数据打包,即可实现确定性的数据读写。在应用场景上,它尤其适用于西门子S7系列PLC(如S7-1200、S7-1500)之间需要频繁交换过程数据(如状态、温度、配方参
别再为S7-1200通讯头疼了!手把手教你搞定PUT/GET和开放式以太网(附TIA Portal配置截图)
本文详细解析了S7-1200 PLC通讯配置的完整解决方案,包括S7通讯与开放式以太网通讯的选型对比、PUT/GET功能块的避坑配置、TCP通讯的工业级实现及故障诊断技巧。通过TIA Portal配置截图和实战案例,帮助工程师快速掌握S7-1200通讯技术,提升工业自动化项目的实施效率。
西门子S7-1200 PLC生产线控制实战解析
工业自动化领域中,PLC(可编程逻辑控制器)作为核心控制设备,通过模块化硬件和高效编程实现产线精准控制。西门子S7-1200系列凭借PROFINET工业以太网和模块化扩展能力,在中小型自动化项目中表现突出。其技术价值体现在:支持SCL高级语言编程实现模糊PID等复杂算法,通过TIA Portal开发环境提升40%编程效率,典型应用于输送带同步、变频器组态等场景。针对热搜中'西门子1200与G120C变频器组态'和'SCL语言写模糊PID控制'等需求,该PLC的150KB工作存储器和标准化通讯协议为工程实施提
Unity3D与西门子S7-1200 PLC虚实结合:自动化立体仓库仿真系统开发全流程
工业自动化与数字孪生技术的融合,正通过虚拟仿真与实体控制的无缝集成,重塑系统设计与调试流程。其核心原理在于利用三维可视化引擎构建高保真动态模型,并通过工业通讯协议与可编程逻辑控制器(PLC)进行实时数据交换,形成一个闭环的虚实交互系统。这一技术的核心价值在于,它能够在物理设备部署前,于虚拟环境中完整验证控制逻辑、工艺流程及人机交互,从而大幅降低硬件成本、调试风险与开发周期。其典型应用场景包括自动化产线虚拟调试、操作员培训、方案可视化展示以及工业元宇宙的初步构建。本文以自动化立体仓库为例,详细阐述了如何利用U
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章