none
请教关于C++里包含文件会重复的问题 RRS feed

  • 问题

  • 请问下面这样会重复包含文件吗?
    我定义了两个类,一个img,一个sound;有5个文件,分别为:img.h、img.cpp、sound.h、sound.cpp、main.cpp
    //img.h
    #include <iostream>
    ......

    //img.cpp
    #include"img.h"

    //sound.h
    #include<iostream>
    .....

    //sound.cpp
    #include"sound.h"


    //main.cpp
    #include"img.h"
    #include"sound.h"

    这种情况会不会造成重复包含文件?就是在main.cpp中会不会重复包含了iostream.h?

    2010年2月24日 4:12

答案

  • 标准的头文件里面都有守卫宏,比如iostream里面有

    #ifndef _IOSTREAM_
    #define _IOSTREAM_
    ...定义代码
    #endif

    这样,重复包含的头文件会自动被编译器忽略而不会有重复定义。

    你自己写的头文件最好也在其开头和结尾加上守卫宏,比如image.h的文件如下

    #ifndef _IMAGE_H_
    #define _IMAGE_H_
    定义或代码(头文件里最好不要有代码,代码放到c或cpp中)
    #endif


    0xBAADF00D
    • 已标记为答案 谐音 2010年2月27日 3:12
    2010年2月24日 15:55
    版主
  • 没有问题,编译器先是把每一个CPP文件编译成 obj文件,然后再进行链接的。 所以只要你的同一个CPP内部不重复的话,就没有关系。
    • 已标记为答案 谐音 2010年2月27日 3:10
    2010年2月26日 8:07

全部回复

  • 1) #include "……"  要写在 #pragma once 下面
    2) 要善于利用预编译头文件,把大家都需要包含的头文件写到stdAfx.h 文件中
    • 已建议为答案 Nancy Shao 2010年2月25日 8:01
    2010年2月24日 6:10
    版主
  • 标准的头文件里面都有守卫宏,比如iostream里面有

    #ifndef _IOSTREAM_
    #define _IOSTREAM_
    ...定义代码
    #endif

    这样,重复包含的头文件会自动被编译器忽略而不会有重复定义。

    你自己写的头文件最好也在其开头和结尾加上守卫宏,比如image.h的文件如下

    #ifndef _IMAGE_H_
    #define _IMAGE_H_
    定义或代码(头文件里最好不要有代码,代码放到c或cpp中)
    #endif


    0xBAADF00D
    • 已标记为答案 谐音 2010年2月27日 3:12
    2010年2月24日 15:55
    版主
  • 没有问题,编译器先是把每一个CPP文件编译成 obj文件,然后再进行链接的。 所以只要你的同一个CPP内部不重复的话,就没有关系。
    • 已标记为答案 谐音 2010年2月27日 3:10
    2010年2月26日 8:07
  • 建议在头文件加上如下信息:
    #ifndef _IOSTREAM_
    #define _IOSTREAM_
    .........
    #endif
    欢迎光临我的个人网站:http://www.joyvc.cn,本网站提供[IM即时通信|棋牌游戏|网游开发|UI编程|网络通讯|组件开发|图像多媒体|数据库]方面的VC/C++/C技术文章、源代码和教程资料
    2010年2月26日 9:41
    版主