+ -
当前位置:首页 → 问答吧 → #pragma once依然会重复包含

#pragma once依然会重复包含

时间:2011-12-19

来源:互联网

环境vc

描述:
a.h
#pragma once

void f()
{
}

b.h

#pragma once

#include"a.h"
void f2();

b.cpp
#include "b.h"

void f2()
{

}

main.cpp

#include<iostream>

#include "a.h"
#include "b.h"
int main()
{
return 0;

}

导致的错误:

Linking...
b.obj : error LNK2005: "void __cdecl f(void)" (?f@@YAXXZ) already defined in mian.obj
Debug/teset.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.


疑问:#pragma once 只包含一次

a.h 只包含了一次啊。。。。。

但是提示却说:b.obj中 包含了

main.obj中 也包含了

所以多次包含。。。。

不是违背了 #pragma once???

后来我发现, 给a.h 再加一个a.cpp即可解决问题。。。。

我想知道什么原因????

作者: qunqun2012   发布时间: 2011-12-19

#pragma once同一个文件不会被包含多次。
它是指在一个文件的编译中,该文件不会被包含多次
如果是多次编译多个文件,还是会被包含多次的(一个文件一次)

作者: keiy   发布时间: 2011-12-19

C/C++ code
// code.h
#pragma once // 如果注释掉,编译code.cpp就报错:重复定义
int i=0;

// code.cpp
#include "code.h"
#include "code.h"


被不同的.cpp包含后,编译无错,但链接报错:int i 已定义于×××.obj

作者: yisikaipu   发布时间: 2011-12-19

引用 1 楼 keiy 的回复:

#pragma once同一个文件不会被包含多次。
它是指在一个文件的编译中,该文件不会被包含多次
如果是多次编译多个文件,还是会被包含多次的(一个文件一次)

++

可以用
#ifndef XX_H
#define XX_H

#endif

作者: johnpher   发布时间: 2011-12-19

引用 3 楼 johnpher 的回复:可以用
#ifndef XX_H
#define XX_H

#endif



这个没用的

解决多个.obj包含重复符号的办法,只能是把不应写到.h里的东西写到.cpp里

作者: yisikaipu   发布时间: 2011-12-19

还是使用
#ifndef XX_H
#define XX_H

#endif
最好
移植性强 保险

作者: mayadong7349   发布时间: 2011-12-19

赞同。。。。。。。。。。。。


.h中还真不能 实现函数。。。。。

放到cpp中。。。。。

否则很可能引起主帖的问题。。。。。




引用 4 楼 yisikaipu 的回复:

引用 3 楼 johnpher 的回复:可以用
#ifndef XX_H
#define XX_H

#endif


这个没用的

解决多个.obj包含重复符号的办法,只能是把不应写到.h里的东西写到.cpp里

作者: qunqun2012   发布时间: 2011-12-19

引用 1 楼 keiy 的回复:
#pragma once同一个文件不会被包含多次。
它是指在一个文件的编译中,该文件不会被包含多次
如果是多次编译多个文件,还是会被包含多次的(一个文件一次)

参照这个!

作者: qscool1987   发布时间: 2011-12-19