#ifndef still cannot garantee .h only be compiled once?

-------------example---------------

-------------ah.h-----------------

#ifndef _AH_H

#define _AH_H

int a=5;

#endif

-------------calla.cpp-------------

#include"ah.h"

void seta()

{

   a=2;

}

------------main-------

#include"ah.h"

#include<iostream>

void seta();

using namespace std;

void main()

{   

   cout<<"a="<<a<<endl;

   seta();

   cout<<"after seta, a="<<a<<endl;

}

==================================================

1>------ 已启动生成: 项目: taextern, 配置: Debug Win32 ------
1>生成启动时间为 2016/6/3 星期五 下午 13:40:55。
1>InitializeBuildStatus:
1>  正在创建“Debug\taextern.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>ClCompile:
1>  所有输出均为最新。
1>ManifestResourceCompile:
1>  所有输出均为最新。
1>calla1.obj : error LNK2005: "int a" ([email protected]@3HA) 已经在 tmain.obj 中定义
1>d:\userdata\administrator\documents\visual studio 2010\Projects\taextern\Debug\taextern.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
1>
1>生成失败。
1>
1>已用时间 00:00:00.13
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

----------------------Example 2---------------

---------set global variable---------

---------set extern -------------

==================================================

--------------ah.h--------------

#ifndef _AH_H

#define _AH_H

int a=5;

#endif

--------------calla.cpp-----------

//#include"ah.h"

extern int a;

void seta()

{

a=2;

}

-------------main----------------

#include"ah.h"

#include<iostream>

void seta();

using namespace std;

void main()

{

cout<<"a="<<a<<endl;

seta();

cout<<"after seta, a="<<a<<endl;

}

-----------------------------------------------------------

OK.

时间: 2024-10-14 22:21:46

#ifndef still cannot garantee .h only be compiled once?的相关文章

编程经验:一个由&lt;Windows.h&gt;引起的bug~

1. 问题描述 最近遇到一个莫名其妙的bug,上网查找,没有找到正确的解决办法,难道大家都没遇到?于是我说一说自己是怎么解决的. 我用的是VS2010,一个解决方案下,添加了多个他人的项目,各个项目配置都使用了库文件(A.lib),编译,唯独其中一个项目,出现了如下错误提示: 错误         26     error C2040: "LPCH":"int"与"int *"的间接寻址级别不同     c:\program files (x86

#ifndef #define #endif 防止头文件被重复引用

想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?   其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的.比如:存在a.h文件#include "c.h

stl_algobase.h

stl_algobase.h // Filename: stl_algobase.h // Comment By: 凝霜 // E-mail: [email protected] // Blog: http://blog.csdn.net/mdl13412 // 这个文件中定义的都是一些最常用的算法, 我仅仅给出一个思路, // 不进行详尽讲解, 具体算法请参考算法书籍, 推荐<算法导论> // 另外, 对于基础薄弱的, 推荐<大话数据结构>, 此书我读了一下 // 试读章节, 适

error &quot;`ft2build.h&#39; hasn&#39;t been included yet!

Add include to "freetype.h" /* add this line */ #include <ft2build.h> #ifndef FT_FREETYPE_H #error "`ft2build.h' hasn't been included yet!" #error "Please always use macros to include FreeType header files." #error &quo

[转]extern与头文件(*.h)的区别和联系

用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢?? 这个问题一直也是似是而非的困扰着我许久,经过实践和查找资料,有如下总结: 一.头文件 首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编译时在#include的地方展开一下,没别的意义了,其实头文件主要是给别人看的. 我做过一个实验,

WDK7的ntimage.h 用于写PE32+

/*++ BUILD Version: 0004 // Increment this if a change has global effects Copyright (c) Microsoft Corporation. All rights reserved. Module Name: ntimage.h Abstract: This is the include file that describes all image structures. --*/ #ifndef _NTIMAGE_

opencv之types_c.h

#ifndef __OPENCV_CORE_TYPES_H__ #define __OPENCV_CORE_TYPES_H__ #ifdef HAVE_IPL #  ifndef __IPL_H__ #    if defined WIN32 || defined _WIN32 #      include <ipl.h> #    else #      include <ipl/ipl.h> #    endif #  endif #elif defined __IPL_H__

CANopenNode drvTemplate/CO_driver.h hacking

/************************************************************************ * CANopenNode drvTemplate/CO_driver.h hacking * 说明: * 使用CANopenNode,drvTemplate/CO_driver.h说明了一些驱动编写相关的 * 注意事项. * * 2017-3-24 深圳 南山平山村 曾剑锋 *************************************

STL源码剖析——基本算法stl_algobase.h

前言 在STL中,算法是经常被使用的,算法在整个STL中起到非常重要的作用.本节介绍的是一些基本算法,包含equal,fill,fill_n,iter_swap,lexicographical_compare,max,min,mismatch,swap,copy,copy_backward,copy_n.其中一个比较重要的算法就是copy,针对copy的剖析在源码中可以看到详细的注解.本文剖析的源码出自SGL STL中的<stl_algobase.h>文件. 基本算法剖析 #ifndef __