c++-C++ 头文件已经防止重定义了,但是还是出现了错误

问题描述

C++ 头文件已经防止重定义了,但是还是出现了错误

test.cpp:
#include"head.h"
int i=3;

main.cpp

#include"head.h"
#include
using namespace std;
extern int i;
int main(){

cout << i<< endl;

system("pause");
return 0;

}

head.h
#ifndef HEAD_H
#define HEAD_H
int ab = 0;
#endif

这个项目出现了重定义的问题,不知道为什么?求解答

解决方案

为何要把ab的定义放在头文件呢?这样被不同的远函数包含就会出现重定义错误。解决办法,在头文件head中int ab=0;换成extern int ab;出现这种错误是对申明和定义理解不够深,要深刻加以区别。

解决方案二:

 #ifndef HEAD_H
#define HEAD_H
int ab = 0;
#else
extern int abc;
#endif

解决方案三:

是被不同的源文件包含。

解决方案四:

好的,知道了,谢了

时间: 2016-09-15

c++-C++ 头文件已经防止重定义了,但是还是出现了错误的相关文章

vc-VC 两个文件包涵同一个头文件 提示变量重定义

问题描述 VC 两个文件包涵同一个头文件 提示变量重定义 总共四个文件.分别是定义main函数的text.cpp定义了一个类 的 a.cpp和a.h还有一个b.h text.cpp代码 #include ""a.h"" #include ""b.h""int main(){ //some code} a.h代码 #pragma onceclass Ca{ //some code}; a.cpp代码 #include "

windows-Linux下pipe()未包含头文件却提示重名问题

问题描述 Linux下pipe()未包含头文件却提示重名问题 (C++)在Windows下可以正常工作的程序,在Linux下无法编译,提示类型未声明.但在此之前我已经声明了名为"pipe"的类,并且添加了构造器.经过查询得知pipe重名,但并未包含有"pipe"的头文件.请问各位大神能否给我一个解释?我的教练拒绝回答我.理由是他不喜欢C++! #include <fstream>#include <cstdlib>using namespac

头文件不宜定义变量的原因全面解析_C 语言

test-1.0使用#ifndef只是防止了头文件被重复包含(其实本例中只有一个头件,不会存在重复包含的问题),但是无法防止变量被重复定义. 复制代码 代码如下: # vi test.c-------------------------------#include <stdio.h>#include "test.h" extern i;extern void test1();extern void test2(); int main(){   test1();   prin

头文件里定义某个变量或者类

问题描述 头文件里定义某个变量或者类 如果没包含这个头文件而又用的到了这个头文件里定义的东西,可以吗? 解决方案 个人认为,头文件中大多都是声明,很少有定义的.如果在头文件中做了定义,很容易引起重复定义的(模板这里不提). 如果你要使用的一个类或变量在当前文件中没有声明或定义,是需要include其所在的头文件的. 在使用中,有时候你或许会发现,哎,我能使用这个类(这个类是在其他文件中声明定义的),可是我没有include它的头文件啊! 这种情况应该是,你include的另外的头文件中inclu

方法-C语言头文件里放声明,其实现放哪?

问题描述 C语言头文件里放声明,其实现放哪? 我写了一个头文件a.h,实现在a.c中,主文件中#include "a.h",报错...我想知道头文件的声明和定义的规范使用方法..谢谢.. 解决方案 首先搞清楚,include和头文件的关系. include的作用是将这个文件的内容插入到include所在的位置,从而构成一个完整的源代码文件被编译. 那么头文件是什么,实际上头文件里可以放任何东西,源代码文件也可以放任何东西,include也可以随意包含. 只是看这三者放在一起,经过替换,

C/C++ 头文件作用

最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是比较模糊的,只是之前的使用大多比较简单,并没有牵涉到太复杂的工程,所以定义和声明还是比较简单而明了了的.但是最近的大工程让我在这方面吃到了一点点苦头,虽然看了别人的代码能够很快的改正,但是这些改正背后的原因却不知道.我想大多数喜欢C语言的程序员应该是和我一样的,总喜欢去追究程序问题背后的底层原因,而这

windows-linux与Windows下不同头文件的对应关系

问题描述 linux与Windows下不同头文件的对应关系 最近在学习"C语言基于socket多人聊天"系统,看到一些网上的内容上有下面的头文件,但是看定义弹出"找不到文件"的对话框,我知道这是linux下的,我想知道这几个如果在windows下写的话分别对应怎样的代码,求各路大神指教 #include #include #include #include #include #include #include 解决方案 winsock2.h//windows下网络编

socket-【C++】符号重定义,头文件包含问题

问题描述 [C++]符号重定义,头文件包含问题 #pragma once #include "Common.h" #include "WinSock.h" class CSockOperation { public: int Send(SOCKET socket,const char* buf,int len);//失败返回错误值 int Recv(SOCKET socket,char* lpBuf,int nBufLen);//失败返回错误值 int CSockO

文件重定义冲突的分析与解决

引言 有时候看到论坛上有人问编译时重定义现象的问题.这个问题与头文件包含冲突有关,改一改相关头文件包含就会让问题消失.我在这里要以 <windows.h> <winsock.h> <winsock2.h>这3个头文件为例分析为什么会产生这种原因:然后给出一种不会产生冲突的做法:最后就此例的分析给出结论.本文对于已经知道冲突原因的读者是多余的,但对于一时没有时间去解的人还是有一定的参考价值的. 一个重命名的例子 先写一个socket基本操作类: // SocketBase