先了解这里的相关知识:http://www.cnblogs.com/stemon/p/4000468.html

头文件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 
还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:

#ifndef <标识>
#define <标识>
......
......
#endif

<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif

2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。

在stdio.h中,如果:里面有一个变量定义

#ifndef _STDIO_H_
#define _STDIO_H_
int i;
...
#endif

在vc中链接时就出现了变量i重复定义的错误,而在c中成功编译。 
结论: 
(1).当你第一次使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了。当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义。然后两个obj被另外一个.cpp(也include这个头)连接在一起,就会出现重复定义.。
(2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int i,则自动认为其中一个是定义,其他的是声明。 
(3).C语言和C++语言连接结果不同,可能(猜测)时在进行编译的时候,C++语言将全局变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。(参考) 
解决方法: 
(1).把源程序文件扩展名改成.c。 
(2).推荐解决方案: 
.h中只声明 extern int i;在.cpp中定义 
<x.h>

#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__

<x.c>

int i; 

注意问题:变量一般不要定义在.h文件中,但是可以把变量的声明放在.h头文件中。

那么怎么算是定义,怎么算是声明呢?具体看这里: http://www.cnblogs.com/stemon/p/4000730.html

C语言中头文件<stdio.h>中的#ifndef _STDIO_H_的更多相关文章

  1. Visual Studio中头文件stdafx.h的作用

    在较新版的Visual Studio中,新生成的C++项目文件的的头文件夹下会默认有头文件stdafx.h,而源文件夹下则默认有源文件stdafx.cpp,手动将这些文件删除后,编译时系统还会报错.下 ...

  2. C++ 中头文件(.h)和源文件(.cc)的写法简述

    用C++编写比较大型的项目时,文件的分割管理确实确实是非常必要的 .下面就非常简洁明了地谈谈头文件(.h)和源文件(.cc)应该怎么写. 头文件(.h):写类的声明(包括类里面的成员和方法的声明).函 ...

  3. 基于函数的I/O操作(头文件stdio.h)

    基于函数库的I/O是C语言标准库的功能,基于系统级I/O函数实现. 系统级I/O函数对文件的标识是文件描述符,C语言标准库中对文件的标识是指向FILE结构的指针.在头文件cstdio或stdio.h中 ...

  4. 文件类型分类:头文件dirent.h中定义的文件类型与linux内文件符号对应关系

    头文件 dirent.h 定义了文件类型: enum{    DT_UNKNOWN = 0,         //未知类型    DT_FIFO = 1,            //first in, ...

  5. C/C++ 中的头文件 stdio.h和stdlib.h

    stdio 就是指 “standard input & output" 标准输入输出 stdio.h所包含的函数: 文件访问fopenfreopenfflushfclose二进制输入 ...

  6. C++中头文件(.h)和源文件(.cpp)都应该写些什么

    头文件(.h): 写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等,但一般来说不写出具体的实现. 在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下): ...

  7. 头文件string.h中的函数及使用方法

    来源:http://blog.csdn.net/tsyj810883979/article/details/5116817 字符串拷贝1 @函数名称:   strdup函数原型:   char *st ...

  8. C标准头文件<stdio.h>

    是很多人学C语言接触的第一个头文件,顾名思义,stdio就是"标准输入输出",其中声明了一组关于输入输出的类型,宏和函数,其中就包括了打印著名的"hello,world! ...

  9. c语言_头文件_windows.h

    概述 Win32程序的开头都可看到: #include <windows.h> WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件 ...

随机推荐

  1. 开源 java CMS - FreeCMS2.3 移动app生成首页数据

    原文地址:http://javaz.cn/site/javaz/site_study/info/2015/28160.html​ 项目地址:http://www.freeteam.cn/ 生成首页数据 ...

  2. Chrome浏览器切换到之前打开的标签页会重新加载

    这是谷歌的一种策略.当系统内存不足时,系统会自动从内存中舍弃标签页 在地址栏输入chrome://flags/#automatic-tab-discarding,设置为停用即可.

  3. Iframe和父窗口互调方法的集合

    1.子iframe里调用父级的方法:window.parent.document.   2.父级里调用子集iframe:window.frames["iframe_text"].d ...

  4. js 刷新网页

    1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...

  5. IIS应用程序池自动回收问题的有效解决办法

    问题:Timer不能持续执行,如果长时间没有访问,就会被IIs自动回收.造成一些定时作业无法完成. 解决方式1:改用windows服务或是winform方式 解决方式2:在Application_En ...

  6. 利用SQL语句产生分组序号

    partition  by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition  by用于给结果集分组,如果没 ...

  7. smarty之缓存笔记

    smarty缓存技术 在smarty中,缓存分为:普通缓存,单模版都缓存,局部缓存. 缓存:1:首选打开缓存配置项:$smarty->caching=true; 2:缓存生命周期的配置选项:$s ...

  8. 实现JSON数据的存储和读取

    事前准备: //创建一个Crime类 public class Crime { private String mTitle; private UUID mUUID; private Date mDat ...

  9. lua学习笔记(1)-基本语法

    ==============变量类型nilnumber(实数)    1 2 3.14 7.65e8string            "hello world" "\n ...

  10. Html.ActionLink("linkText","actionName")

    一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是该链接要显示的文字,第二个参数是对应的控制器的方法, ...