最近发现如果遵循“在头文件.h中不再包含头文件.h”的原则,可以从根本上避免这个问题。虽然这样做会使得在代码文件.c或.cpp中必须各自包含进来所需的头文件.h,还要注意在包含时可能会存在顺序的问题,但这比起查找何处进行了重定义来说简单了许多,也使包含关系更加清晰。对原来的项目中的所有文件按上述原则进行...
我们知道,#ifndef 是通过定义独一无二的宏来避免重复引入的,这意味着每次引入头文件都要进行识别,所以效率不高。但考虑到 C 和 C++ 都支持宏定义,所以项目中使用 #ifndef 规避可能出现的“头文件重复引入”问题,不会影响项目的可移植性。 和ifndef 相比,#pragma once 不涉及宏定义,当编译器遇到它时就会立刻知道...
文件而言,当其第一次被编译器处理时,由于宏HEADER_FILE_NAME_H尚未定义,所以编译器会定义宏HEADER_FILE_NAME_H并处理“头文件内容”部分的代码,之后,当其因多次在其他源文件引用而被编译器处理时,由于宏HEADER_FILE_NAME_H已经被定义,编译器则不会再重复处理“头文件内容”部分的代码,有效防止了头文件的重复...
头文件一般只包含函数或变量的声明,不要包含定义,否则会出现重定义的问题;一般将函数实现或变量的定义放在C或cpp中;另外在c或cpp中头文件的重复包含也会出现重定义的问题。 为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并...
方法一:用ifndef防止头文件嵌套 一般情况下采用这种手段确保头文件只编译一次。但是此方法只能解决头文件重复包含导致的编译阶段重定义错误;不能解决全局变量定义和函数定义导致的链接阶段重定义错误。 一般采用下面的形式: /* *myheader.h */ #ifndef _MYHEADER_H_ #define _MYHEADER_H_ /*头文件内容*/ #endif...
1、头文件重复包含:如果两个头文件互相包含,或者一个源文件多次包含同一个头文件,可能导致宏定义或类型重复定义的错误。 解决方法:使用预处理器指令#ifndef、#define和#endif来防止头文件内容被重复包含。 2、头文件路径错误:编译器找不到头文件,或者提供的路径不正确。
如何防止两次包含头文件?问题是我包括在MyClass.h中,然后在许多文件中包含MyClass.h,因此它包含多次,并且发生重定义错误。怎么预防? 我使用#pragma一次而不是使用包括卫兵,我想那很好。 MyClass.h: // MyClass.h #pragma once #include <winsock2.h> ...
这样就可以通过编译,main.cpp文件也可以正常运行了。所以我们在编写头文件时,尽量将所有语句放在#ifndef语句块中,防止重定义报错。至于命名规则,通常#ifndef以及#define后面接的是头文件名称的全部字符大写,如#ifndef __C_H,当然也可以自行任意命名,为编译器添加一个可识别的标签即可 ...
1、01: 防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H/头文件内容#endif02: 重新定义一些类型防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef unsigned char boolean; /* Boolean value type. */typedef unsigned long int uint32; /* 2、Unsigned 32 bit value *...