注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.Right

不顾一切的去想,于是我们有了梦想。脚踏实地的去做,于是梦想成了现实。

 
 
 

日志

 
 
关于我

人生一年又一年,只要每年都有所积累,有所成长,都有那么一次自己认为满意的花开时刻就好。即使一时不顺,也要敞开胸怀。生命的荣枯并不是简单的重复,一时的得失不是成败的尺度。花开不是荣耀,而是一个美丽的结束,花谢也不是耻辱,而是一个低调的开始。

网易考拉推荐

今天遇见了#include guard 问题,搞定之  

2012-04-06 23:14:25|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

缘起:今天试试Numerical recipes in C++ 3rd Edition中定义的类的使用,用Gcc编译返回如下错误,网上查了下原来是多次重复包含造成的,可能是Gcc的一个小bug,顺便研究下C++ / C中include guard的使用。希望给后来者有帮助,阿弥陀佛!

---------- g++ CompileLink ----------
正在编译并连接. . .
In file included from D:\Tools\MinGW\include\sys/fcntl.h:7:0,
                   ......省略了好多......

                 from D:\sources\code\nr3.h:20,
                 from Noname1.cpp:2:
D:\Tools\MinGW\include\sys/fcntl.h:7:20: error: #include nested too deeply
D:\sources\code\nr3.h:494:19: warning: 'NaN' defined but not used
编译连接完毕.

解决方案:

1) 修改D:\Tools\MinGW\include\sys/fcntl.h如下

#ifndef _FCTL_H
#define _FCTL_H      // 想想为什么定义一次后 再也进不来这一段了
 #include <fcntl.h>
#endif

2)修改D:\Tools\MinGW\include\sys/fcntl.h如下

#pragma once
#include <fcntl.h>

 

3)普及下重复包含的知识。。。

什么是重复包含? 答:同一个头文件不能被两次或两次以上包含是针对同一个源文件而言的。

The

#ifndef xx  #define xx    ... //这里是需要#include一次的文件,或者是需要定义一次的类  #endif  

method is to make sure that a header file isn't included more than once from the same c file.

You can not - and normally don't want to - stop multiple c files from including the same header file.

A header file is included because:
1) You have specifically added a line #include "xx" or #include <xx> in the source file. Don't do that unless you want the file to be included :)
2) You are including one header file, that it it's turn (one or more steps away) includes another header file. But a header file should only contain a recursive #include if it really needs that other file for some declarations. Hence, you need to include it.

 

 

如果有以下几个头文件及其包含关系为:

File1.h,file2.h,file3.h,file4.h,file5.h,main.cpp

那么:file3.h包含file1.h,file2.h,file4.h包含file1.h,file2.h,file5.h包含file3.h,file4.h。这样就会导致在file5中对file1和file2的重复包含,编译时就会报错。

解决方法:

1:利用 #ifndef

         #define

        #endif

         即每个文件在定义时都写成如下形式(以file1.h为例):

             #ifndef H_FILE1      // 一般 globals.h 用 _GLOBALS_H

             #define H_FILE1

                  #include<stdio.h>

             #include<math.h>

              …..

                   #endif

File3.h:   #ifndef H_FILE3

             #define H_FILE3

                   #include<stdio.h>

             #include<math.h>

                   #inlcude”file1.h”

                   #include”file2.h”

                    …..

                   #endif

方法二:在每个文件的头部定义:#pragma once (用于说明本文件中的内容只使用一次)

例:fiel1.h:

                   #pragma once

                   #include<stdio.h>

             #include<math.h>

                         …..

         File3.h:

                   #pragma once

                   #include<stdio.h>

                   #include<math.h>

                   #include”file1.h”

                   …..


 

If the header file must be seen by multiple source files, you can't use it to allocate global variables, since the linker would then complain about multiple sets of global variables with the same name. This can be solved with the following:

//globals.h  #ifndef _GLOBALS_H  #define _GLOBALS_H  #if defined MAIN  #define EXTERN     // 在main.c 中EXTERN 定义为 "空"  #else  #define EXTERN extern  #endif  ...  EXTERN int my_global_variable;  #endif // _GLOBALS_H  

// main.c
#define MAIN
#include "globals.h"
...
// misc.c  #include "globals.h"  ...  

In this case, only the inclusion in main.c will result in an "allocation" of global variables, because the #define EXTERN will be empty. All other source files that includes "globals.h" will just see the type information for the global variables.

  评论这张
 
阅读(1037)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016