关于static和extern

malone1 2009-01-04 10:25:36
vc6.0下
//main.cpp
#include"f1.h"
#include<stdio.h>
//问题一:static不是用来把全局变量限制在本模块用的吗?为什么main.cpp还能正常使用.已经用static了
extern int a;问题二:extern是用来在模块之间共享变量的,为什么我用了这句,f1.h中去掉static会报连接错误。用的那里有问题?
int main(void)
{
printf("%d\n",++a);
return 0;
}
//f1.h
static int a=9;
难道和ms编译器有关?
...全文
212 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
agaric 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 malone1 的回复:]
你们的意思。划分模块是按.c或者.cpp决定的?
[/Quote]

是的。头文件的存在是为了方便程序员维护代码,并不是编译器需要的东西。

在头文件里声明函数,定义宏,和你在.c里面做同样的事情效果是一样的。头文件的存在,是因为很多函数的声明,宏的定义,要在多个.c里面用到,如果不用头文件的方式,你如果要修改函数的声明,就要修改所有用到这个函数的.c文件。

推荐看看<深入理解计算机系统>,里面对于程序的编译,链接,做了详细的介绍。
zhangquangood 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 agaric 的回复:]
你得弄清楚include头文件是怎么回事

include 只是简单把头文件展开到.c当中去,这个展开的动作是在“预编译”阶段进行的。也就是说,编译器根本不知道有头文件的存在,main.cpp和所有它包含的头文件是一个整体,就是同一个模块。

你在头文件里面去掉了static , cpp中定义的却是一个static 当然会产生错误。
[/Quote]
是这个理
malone1 2009-01-04
  • 打赏
  • 举报
回复
你们的意思。划分模块是按.c或者.cpp决定的?
OenAuth.Core 2009-01-04
  • 打赏
  • 举报
回复
vc6.0下
//main.cpp
#include"f1.h"
#include <stdio.h>
//问题一:static不是用来把全局变量限制在本模块用的吗?为什么main.cpp还能正常使用.已经用static了
static 主是要用来限制.cpp文件的。如下,假如有一f1.cpp文件。

extern int a;问题二:extern是用来在模块之间共享变量的,为什么我用了这句,f1.h中去掉static会报连接错误。用的那里有问题?

你把变量定义在f1.cpp里面就不会错了,你在main里面include "f1.h"那就相当于
int a;
int main(void)
{
printf("%d\n",++a);
return 0;
}


int main(void)
{
printf("%d\n",++a);
return 0;
}
//f1.h
static int a=9;
//f1.cpp
#include "f1.h"
static int b=0; // 这样用
void test()
{
a=10;
}
zlshum 2009-01-04
  • 打赏
  • 举报
回复
楼主以为.h文件是一个模块!
呵呵,要测试static的语意,再想想吧?
chenzhp 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 brookmill 的回复:]
楼主所说的“本模块”,是指c或cpp文件,而不是头文件。
头文件实际上是处在所有包含它的cpp里面。
[/Quote]
!
bitwwzhang130 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 agaric 的回复:]
你得弄清楚include头文件是怎么回事

include 只是简单把头文件展开到.c当中去,这个展开的动作是在“预编译”阶段进行的。也就是说,编译器根本不知道有头文件的存在,main.cpp和所有它包含的头文件是一个整体,就是同一个模块。

你在头文件里面去掉了static , cpp中定义的却是一个static 当然会产生错误。
[/Quote]
同意
OenAuth.Core 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 agaric 的回复:]
你得弄清楚include头文件是怎么回事

include 只是简单把头文件展开到.c当中去,这个展开的动作是在“预编译”阶段进行的。也就是说,编译器根本不知道有头文件的存在,main.cpp和所有它包含的头文件是一个整体,就是同一个模块。

你在头文件里面去掉了static , cpp中定义的却是一个static 当然会产生错误。
[/Quote]

UP
brookmill 2009-01-04
  • 打赏
  • 举报
回复
楼主所说的“本模块”,是指c或cpp文件,而不是头文件。
头文件实际上是处在所有包含它的cpp里面。
楼主最好再看看书上#include的部分。
agaric 2009-01-04
  • 打赏
  • 举报
回复
你得弄清楚include头文件是怎么回事

include 只是简单把头文件展开到.c当中去,这个展开的动作是在“预编译”阶段进行的。也就是说,编译器根本不知道有头文件的存在,main.cpp和所有它包含的头文件是一个整体,就是同一个模块。

你在头文件里面去掉了static , cpp中定义的却是一个static 当然会产生错误。
brookmill 2009-01-04
  • 打赏
  • 举报
回复
f1.h被main.cpp包含了,所以f1.h里面的定义等于就在main.cpp里面

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧