初始化时间问题

liyxxx 2010-08-30 01:07:42
共有3个文件
MyClass.h

#ifndef NUM
#define NUM 100
#endif
class MyClass
{
public:
int table[NUM];
void MyRead();
};

MyClass.cpp

#include <iostream>
#include "MyClass.h"
using namespace std;
void MyClass::MyRead()
{
cout<<sizeof(table)<<endl;
}

main.cpp

#define NUM 10
#include "MyClass.h"
main()
{
MyClass mc;
mc.MyRead();
return 0;
}


编译后执行main.exe,为什么最后输出的是400而不是40呢?我的NUM应该是在类之前定义的吧。编译器:g++ 3.4.5
...全文
204 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
fbs216zhou 2010-08-31
  • 打赏
  • 举报
回复
看一下main.cpp昊面的#include 和#define 先后顺序
liyxxx 2010-08-30
  • 打赏
  • 举报
回复
刚才做了个实验,如果程序是这样:
#main.cpp
#define NUM 10

#MyClass.h
#ifndef NUM
#define NUM 100
#endif
编译没有任何问题,NUM=100,说明main.cpp中的NUM对MyClass.h没有影响。
而如果将2个define对换一下,即:
#main.cpp
#ifndef NUM
#define NUM 10
#endif

#MyClass.h
#define NUM 100
结果是编译出错,重复定义。说明main.cpp的NUM还是对MyClass.h有影响的,这让我很迷惑。
哪位高人能解答一下?
fbs216zhou 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 liyxxx 的回复:]
我试了一下,果然是楼上说的这种情况!
现在的问题是:既然在不同的文件中#define不能用,那防止重复包含的#ifndef……#define……#endif是怎么实现的呢?
[/Quote]

不是在不同的文件中不能用,而是看有没有包含,你把包含关系理一下,看看在MyClass的实现时,有没有包含进main.cpp里面的那个NUM,在你的程序中是没有的
liyxxx 2010-08-30
  • 打赏
  • 举报
回复
学习了,对这种包含的机制有所了解,但是编译器对于我给出的这种情况竟然没有警告,迷惑。
maoxing63570 2010-08-30
  • 打赏
  • 举报
回复
编译器要求,数组的大小在编译时就要是一个确定的值,那么在这之前可以看到的又只有400,所以是400了,运行起来后,数组的大小是不可以动态的改变的
烂番 2010-08-30
  • 打赏
  • 举报
回复
MyClass.h在编译时是不知道其它地方有#define NUM的,所以会重新定义NUM
在main.cpp里展开时,就把main.cpp里的覆盖了

如果MyClass.h在头部#include "xx.h" 而xx.h里定义了NUM,这时MyClass.h是不会重新定义NUM的
maoxing63570 2010-08-30
  • 打赏
  • 举报
回复
数组的大小不是编译时就确定了,运行起来是不可以改变的,也就说是不可能改变为40的,我是这么理解的
maoxing63570 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luver 的回复:]
这个一般编译器会出warning,然后以后define的为准

你把这个#define放在 #include后面,就是另一种结果了
[/Quote]
即使放在#include后面,也是400,是没有改变的
liyxxx 2010-08-30
  • 打赏
  • 举报
回复
我试了一下,果然是楼上说的这种情况!
现在的问题是:既然在不同的文件中#define不能用,那防止重复包含的#ifndef……#define……#endif是怎么实现的呢?
cs_yagami 2010-08-30
  • 打赏
  • 举报
回复
define不是static這類型的東西,它就只是替換,不同檔案中,它的作用域只存在於該檔案裡而已。
所以你在MyClass.h裡定義NUM為100,跟main裡定義NUM為10,這兩者是不相甘的。
fbs216zhou 2010-08-30
  • 打赏
  • 举报
回复
在MyClass这个类中,只知道有MyClass.h中那个NUM,根本就无法用main.cpp那个NUM. 看看文件包含方面的内容就会明白.
你可以试一下,如果将MyClass.h中那个NUM去掉,程序编译不过去.
main.cpp中的那个NUM在这种情况下只在本文件中有用.
夏卡罗 2010-08-30
  • 打赏
  • 举报
回复
你可以单步跟踪调试观察NUM值的变化情况,跟踪得到的结果是正确的,也可以发现到底用的是哪个 #define NUM
为最后的初始化。
烂番 2010-08-30
  • 打赏
  • 举报
回复
这个一般编译器会出warning,然后以后define的为准

你把这个#define放在 #include后面,就是另一种结果了
liyxxx 2010-08-30
  • 打赏
  • 举报
回复
难道初始化的顺序不应该是:main.cpp、MyClass.h、Myclass.cpp吗?怀疑是不是我的用法不对,
#ifndef NUM
#define NUM 100
#endif
以至于第一句没起作用。希望高手能答疑。
maoxing63570 2010-08-30
  • 打赏
  • 举报
回复
void MyClass::MyRead()
{
cout<<sizeof(table)<<endl;
}
这个操作,你执行的时候,可以看到的就是#define NUM 100;
maoxing63570 2010-08-30
  • 打赏
  • 举报
回复
你在MyClass.cpp中用的是#include "MyClass.h"这个文件中的#define NUM 100并不是main中的#define NUM 10

liyxxx 2010-08-30
  • 打赏
  • 举报
回复
看清楚了,我程序中一共出现了2个#define NUM,我想知道的是为什么起作用的是#define NUM 100,而不是#define NUM 10,还是我这种用法不对?
  • 打赏
  • 举报
回复
void MyClass::MyRead()
{
cout<<sizeof(table)<<endl;
}

到这里的时候NUM是100。所以结果是400
在main中sizeof(MyRead)的话就是40了。
maoxing63570 2010-08-30
  • 打赏
  • 举报
回复
100*4=400,一个int为4,100个int为400

64,318

社区成员

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

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