C++条件编译的小问题,非常感谢!!!

来源:百度知道 编辑:UC知道 时间:2024/05/30 08:04:16
首先谢谢您能这么热心地帮助我,以下是我的问题:

我用VC++ 6.0自动生成了一个类,但是,我不明白该类的头文件的条件编译!
我的问题是:
1.编译一个.cpp是否必须只能编译一次?多次编译是否会报错?
2.帮我讲一下 下面头文件的条件编译的各行代码
3.谢谢!

// Merchandize.h: interface for the Merchandize class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MERCHANDIZE_H__8DFCE3D4_984C_43F3_9233_ACD9EFED095B__INCLUDED_)
#define AFX_MERCHANDIZE_H__8DFCE3D4_984C_43F3_9233_ACD9EFED095B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define MERCH_NAME_LENGTH 30

class Merchandize
{
public:
Merchandize();
virtual ~Merchandize();

private:
char name[30]; //商品名称
char serNum[15]; //商品编号
char type[10]; //商品型号
char spec[10]; //商品规格
char unit[6]; //计量单位
char proArea[10]; //商品产地
char sup[30]; //供货信息
char remark[30]; //注解
};

#endif // !defin

1.编译一个.cpp是否必须只能编译一次?多次编译是否会报错?

答:这应该是一个.h头文件吧,这里面定义了一个类,因为
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
的存在, 这个类只能编译一次。
这么做是为了节约编译时间,节省空间。
(如果不加这句,当这个类的头文件在多个地方被引用时,每引用一次就会编译一次。虽然不会出很大的问题,但是并没有什么好处。)

2.帮我讲一下 下面头文件的条件编译的各行代码

条件编译,即:

#if !defined(AFX_MERCHANDIZE_H__8DFCE3D4_984C_43F3_9233_ACD9EFED095B__INCLUDED_)
#define AFX_MERCHANDIZE_H__8DFCE3D4_984C_43F3_9233_ACD9EFED095B__INCLUDED_
...
...
...
#endif // !defined(AFX_MERCHANDIZE_H__8DFCE3D4_984C_43F3_9233_ACD9EFED095B__INCLUDED_)

这是机器自动产生的,所以有些啰嗦,如果我们手动写,完全可以写成这样:
#ifndef _MERCHANDIZE_H_
#define _MERCHANDIZE_H_
...
...
...
#endif
意思就是防止头文件被重复包含。

比如在一个文件 a.h中包含了Merchandize.h,
在b.h中也包含了Merchandize.h。
在另一个文件 c.cpp中要包含 a.h 和c.h,展开后,会发现,Merchandize.h被包含了两次 。如果没有
#ifndef _MERCHANDIZE_H_
#define _MERCHANDIZE_H_
...
...