游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4687|回复: 12

关于重复编译的问题

[复制链接]

66

主题

223

帖子

223

积分

中级会员

Rank: 3Rank: 3

积分
223
发表于 2007-10-29 23:05:00 | 显示全部楼层 |阅读模式
试验如下: 新建一个控制台工程,添加三个文件: main.cpp , h.h , another.cpp

--------------h.h 内容如下---------------------------------
#pragma once
#ifndef __h__
#define __h__

typedef unsigned long DWORD;

struct sRHWVertex
{
        float _x,_y,_z,_rhw;
        DWORD _Color;
        float _u,_v;
        static const DWORD RHW_FVF;
};

const DWORD sRHWVertex::RHW_FVF = 1;


#endif

--------------main 内容如下------------------------------------------
#include "h.h"
void main()
{
}

--------------another.cpp内容如下-----------------------------------
#include "h.h"



现在链接时报错如下
正在链接...
LINK : warning LNK4075: 忽略“/EDITANDCONTINUE”(由于“/INCREMENTAL:NO”规范)
cpp.obj : error LNK2005: "public: static unsigned long const sRHWVertex::RHW_FVF" (?RHW_FVF@sRHWVertex@@2KB) 已经在 main.obj 中定义
.\Debug/main.exe : fatal error LNK1169: 找到一个或多个多重定义的符号


为什么啊,,难道h.h里面的#pragma once,#ifndef __h__,#define __h__不起作用么?
各位高人,求解~

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2007-10-30 00:21:00 | 显示全部楼层

Re:关于重复编译的问题

定义不要写在头文件里,写在h.cpp里

66

主题

223

帖子

223

积分

中级会员

Rank: 3Rank: 3

积分
223
 楼主| 发表于 2007-10-30 11:35:00 | 显示全部楼层

Re:关于重复编译的问题

哦原来是这样,那顺便也解决下#pragma once和#ifndef __h__,#define __h__的问题吧
这些命令在什么场合下才起作用?

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2007-10-30 14:12:00 | 显示全部楼层

Re:关于重复编译的问题

头文件都要加上,防止重复include造成的重复声明

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2007-10-30 14:16:00 | 显示全部楼层

Re:关于重复编译的问题

比如有ex1.h,ex2.h,main.c
ex2.h中include了ex1.h
main.c里又同时include了ex1.h和ex2.h,就等于main.c里include了两遍ex1.h
加了之后,通过宏判断,在发现重复include时,舍弃掉重复的内容

6

主题

65

帖子

67

积分

注册会员

Rank: 2

积分
67
发表于 2007-10-30 19:50:00 | 显示全部楼层

Re:关于重复编译的问题

#ifndef   _XXX_   
  #define   _XXX_   
  ........   
  #endif   
是针对一个源文件说的,告诉这个源文件不要重复包含这个头文件。

#pragma   once是要求编译器在编译过程中只将包含“#pragma   once”的文件编译(打开)一次,从而避免重复包含此文件。

66

主题

223

帖子

223

积分

中级会员

Rank: 3Rank: 3

积分
223
 楼主| 发表于 2007-10-30 20:24:00 | 显示全部楼层

Re:关于重复编译的问题

噢~谢谢各位的回答~

1

主题

11

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2007-10-31 11:04:00 | 显示全部楼层

Re: Re:关于重复编译的问题

funcman: Re:关于重复编译的问题

定义不要写在头文件里,写在h.cpp里

那如果其它头文件需要引用该定义,那要怎么做include或者声明呢?

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2007-10-31 20:58:00 | 显示全部楼层

Re:关于重复编译的问题

别的文件知道声明不就行了,link会自己找定义

103

主题

1432

帖子

1458

积分

金牌会员

Rank: 6Rank: 6

积分
1458
QQ
发表于 2007-11-1 11:30:00 | 显示全部楼层

Re:关于重复编译的问题

楼主完全误解了.

防止的是一个cpp文件引入两次以上同一个头文件.
而不是防止两个cpp文件分别引入同一个头文件.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-19 05:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表