关于C++头文件与cpp文件的疑问

问题描述

关于C++头文件与cpp文件的疑问

http://www.cnblogs.com/laojie4321/archive/2012/03/30/2425015.html
我从上面的网站中看到这么一段话
如果在头文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此头文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错
然后我自己测试了一下,在一个项目内建立了aaa.cpp,bbb.cpp,ccc.h这三个文件,
在ccc.h中写
class A
{
int a;
void f(){}
};
然后在bbb.cpp和aaa.cpp文件中都包括了这个头文件,发现并没有出错,这是怎么回事?
第二个测试:
我在ccc.h文件中写
class A
{
static int a;
};
int A::a=9;
然后在aaa.cpp和bbb.cpp文件中都包括这个头文件,发现出错了,但是如果我去掉
ccc.h文件中的“int A::a=9;”这一行代码后再编译,发现并没有出错,
或者再新建立一个ddd.cpp文件中写到
#include"ccc.h"
int A::a=9;
同时去掉ccc.h文件中的“int A::a=9;”这一行代码后再编译,发现并没有出错,
这是怎么回事?
第三个测试:
一个全局变量不能在多个CPP文件中重复定义,但是一个类可以在多个CPP文件中重复定义
我在aaa.cpp文件中写
class M
{
int a;
void g(){}
};
在bbb.cpp文件中写
class M
{
double a;
void f(){}
};
编译后发现都没出错,这又是怎么回事?

解决方案

你那个不是全局变量,是类的成员变量。
另外重复包含一个类的定义肯定会出错,不知道你说的不出错是什么意思,你有没有真正把它们添加到项目中。

解决方案二:

include相当于把头文件放在包含指令的位置。

你两个不同的源代码文件定义重名的类,这个可以。
定义方法和全局变量不可以。

有什么问题?

解决方案三:

方法就是函数,
返回值 函数名(参数) { 函数体 }
变量就是
类型 变量名
类就是
class 类名 { ... };
明白?

解决方案四:

楼主没有学过c吧,一个是面向对象一个是面向过程的,不一样的,c++有函数重载,名字相同不会报错的,c不一样的,我刚刚看完c正在看c++也不是很清楚,可以参考一下这个http://bbs.csdn.net/topics/390679710,

解决方案五:

这是重复包含的问题,头文件中要使用宏来防止重复包含!
#ifndef xxx_xx_h
#define xxx_xx_h
class A
{
public:
void fun()
{
}
}
#endif // end of xxx_xx_h
另外,静态成员要在.h文件申明,在cpp中初始化!不然就会在多个obj文件中重复包含!
让类的定义在.h文件 , 实现在cpp文件 ,这样才符合正常的编码规范!不要全部挤在一起!

时间: 2025-01-25 12:05:18

关于C++头文件与cpp文件的疑问的相关文章

C++的头文件和实现文件分别写什么

在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析.于是,在C++中就要分出了头(.h)文件和实现(.cpp)文件,并且也有了Package的概念. 对于以C起步,C#作为"母语"的我刚开始跟着导师学习C++对这方面还是感到很模糊.虽然我可以以C的知识面对C++的语法规范,用C#的思想领悟C++中类的使用.但是C#中定义和实现是都在一个文件中(其实都是在类里面),而使用C的时候也只是编程的刚刚起步,所写的程序也只要一个文件就够了.因此对于C++的Package

C++的头文件和实现文件详解_C 语言

在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析.于是,在C++中就要分出了头(.h)文件和实现(.cpp)文件,并且也有了Package的概念. 对于以C起步,C#作为"母语"的我刚开始跟着导师学习C++对这方面还是感到很模糊.虽然我可以以C的知识面对C++的语法规范,用C#的思想领悟C++中类的使用.但是C#中定义和实现是都在一个文件中(其实都是在类里面),而使用C的时候也只是编程的刚刚起步,所写的程序也只要一个文件就够了.因此对于C++的Package

c++模板编程问题-怎样用DEV~C++在.cpp文件中插入一个.c文件,用在.cpp的头文件中去

问题描述 怎样用DEV~C++在.cpp文件中插入一个.c文件,用在.cpp的头文件中去 .cpp文件: #include #include using namespace std; int main() { template m; m.CreateList(10); for(int i = 0; i < length; i++) cout << elem[i] << " "; cout << endl; m.Insert(2, 7); for

怎样在ubuntu环境下用c++写一个cpp文件,创建Mydisk.img文件并写入一个大数组?

问题描述 怎样在ubuntu环境下用c++写一个cpp文件,创建Mydisk.img文件并写入一个大数组? 要用到入口函数吗?需要包含什么头文件?这是用来做虚拟磁盘的,之后还有划分各种区以及把另一个文件存进去取出来的步骤--应该是需要文件句柄?这个怎么取得? 非常感谢! 解决方案 不知道你要做什么.如果你完全用C++自己创建所谓的磁盘镜像,起码你要这两部分,一个是你的img本身的文件格式是什么,一个是你的磁盘的文件系统是什么. 这些不是写几行代码能做到的. 解决方案二: Ubuntu创建一个指定

c++-Xcde如何打开现有cpp文件

问题描述 Xcde如何打开现有cpp文件 刚开始学编程,老师上课用的是VS,然后有几个文件让我们回家自己看,可是我用的是macbook,xcode如何打开老师用vs编好的cpp文件呀? 解决方案 混合变成,把main.m改为main.mm,把你的头文件添加进去就OK了,用include 解决方案二: 设置蛮麻烦,除了上面,还要设置编译器选择,还有文件依据类型编译等等

.h和.cpp文件的区别(zt)详细介绍_C 语言

因刚接触VC++的开发,需要对C++一些原理性的东西进行掌握.特别是对源文件和头文件的概念,需要深入对它了解: 关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话, 就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上 就可以分别放在一个单元,也就是cpp里面) 那么就是一个

&lt;转&gt;.h和.cpp文件的区别

关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成, 也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话, 就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上 就可以分别放在一个单元,也就是cpp里面)     那么就是一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序), 组成一个.exe,也

linux编程-怎么让自己写的头文件在一个.c文件中其作用?

问题描述 怎么让自己写的头文件在一个.c文件中其作用? count.h 1 #ifndef COUNT_H 2 #define COUNT_H 3 int count(int x); 4 #endifcount.c 1 #include 2 int count(int x) 3 {return 2*x; } num.c 1 #include""stdio.h"" 2 #include""count.h"" 3 int main

c++ 头文件定义数组 实现文件初始化 问题

问题描述 c++ 头文件定义数组 实现文件初始化 问题 c++ 新手 在类里定义一个数组 class A { public: A(); private: int m_a[3]; }; 在实现文件里初始化 A::A() { // 这样为什么不对 m_a = {1, 2, 3}; // 这样就可以 m_ap[0] = 1; m_ap[1] = 2; m_ap[2] = 3; } 怎样才能在实现文件里初始化 我知道有一种是用static有没有其它的方法 解决方案 m_a 是一个地址 ,m_a = {1