#ifndef

文件中的#ifndef 

头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 

还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的: 

#ifndef <标识> #define <标识> 

...... ...... 

#endif 

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

#ifndef _STDIO_H_ #define _STDIO_H_ 

...... 

#endif 

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

#ifndef AAA#define AAA...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文件中。
时间: 2024-08-02 06:44:28

#ifndef的相关文章

#ifdef、#ifndef、#else、#endif执行条件编译

我们开发的程序不只在pc端运行,也要在移动端运行.这时程序就要根据机器的环境来执行选择性的编译,如对PC端编译PC端的程序,对移动端编译移动端的程序,这里我们就可以用两组条件编译. #ifdef  #endif #ifndef #endif 我们先来了解下#ifdef ...#endif:语法格式是: #ifdef 宏名字           |#ifdef 宏名字 //任意代码             |//任意代码 #endif                       |#else |/

[C++]关于头文件中的防卫式声明(#ifndef...#pragma once)

大家知道,我们写.h文件时,通常会加上防卫式声明,有以下两种方式: 1. 宏定义 #ifndef _FILENAME_ #define _FILENAME_ //... #endif 2. 编译器指令 #pragma once 但是,为什么头文件中需要添加这种防卫式声明呢?如果没有这样的声明,会出现怎样的问题.这里,先看一个例子. -- "Car.h",代码如下(并没有添加防卫式声明): // Car.h class Car { // ... }; -- "Person.h&

#ifndef是什么意思????

看了网上别人的文章,以前对ifndef的含义一直有些困惑.现在终于明白了. 以下文件在"os_cpu.h"中. #ifndef __OS_CPU_H__#define __OS_CPU_H__ /* 中间有许多定义啦声明啦!:: */ #endif /*__OS_CPU_H__*/ 这样,在编译阶段(ifndef是在编译阶段起作用滴!)假设有两个文件同时include了这个文件(os_cpu.h),这两个文件如果一个先 编译了,那么__OS_CPU_H__就被定义了.当编译到第二个文件

C/C++预处理指令#define,#ifdef,#ifndef,#endif…

本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif结束一个#if……#else条件编译块 #error停止编译并显示错误信息 本来只是想了解一下#ifdef,#ifnd

#pragma once 与 #ifndef

#pragma once:保证头文件只被编译一次.这种方式,是微软编译器独有的,也是后来才有的,所以知道的人并不是很多,用的人也不是很多,因为他不支持跨平台.如果你想写跨平台的代码,最好使用上一种.这是一种由编译器提供支持的方式,防止同一文件的二次编译,这里的同一文件指的是物理文件. #ifndef #define //code #endif 这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译.所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这

pragma once与#ifndef的作用有什么区别

#pragma once 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次 #pragma once用来防止某个头文件被多次include,#ifndef,#define,#endif用来防止某个宏被多次定义. #pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了. #ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏

(转)#ifndef的用法

原文链接:http://wenku.baidu.com/link?url=c4doqVo3U429RkwTN5eaJIfD2rEu-1bLKKQXuqO8drmL359PhUjVmzC7P94wBY90bqYjPBRiuujahij4AM_06OkiOThB3v91fXexqpIukG_ 定义 #ifndef x #define x ... #endif   这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包

对#ifndef的理解

由于对#ifndef的用法不太理解,在询问了老师#ifndef的含义以及查找资料后,对#ifndef总结了以下几点: <1> #ifndef是宏定义的一种,是三种预处理功能(宏定义,文件包含和条件编译)中的其中一种:条件编译. <2> 条件指示符#ifndef的作用和目的是:避免变量的重复定义,防止重复包含和编译同一个头文件.例如:有两个文件同时include了div.h这个文件,这两个文件其中一个先编译了,那么_DIV_H_已经被定义了,当编译第二个文件的时候,在#ifnef的时

c语言中的#ifdef和#ifndef

#include "stdio.h"#include "conio.h"#define MAX#define MAXIMUM(x,y) (x>y)?x:y#define MINIMUM(x,y) (x>y)?y:xvoid main(){int a=10,b=20;#ifdef MAXprintf("\40: The larger one is %d\n",MAXIMUM(a,b));#elseprintf("\40: Th

#ifndef #define

1 #ifndef __FIGHTING_H 2 #define __FIGHTING_H 3 4 // blahblah 5 6 #endif 这里#ifndef 和 #define 后面的字符串指宏定义,一般使用大写字母表示,可以是任意的字符串,一般为了方便理解尽量和头文件的名字保持一致,在头文件第一次被包含的时候该宏即被定义,编译器会给该字符串赋一个值,在下次引入头文件时就会发现该宏已经被定义,从而避免重复包含头文件.