2014-10-28 20:57:21 hanshuning 阅读数 2552
  • 20150613.CPP语言

    尹成讲师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!

    6864 人正在学习 去看看 尹成

不是很严格的讲,*.h文件做的是类的声明,包括类成员的定义和函数的声明,而*.cpp文件做的类成员函数的具体实现(定义)。

一个*.h文件和*.cpp文件一般是配对的。在*.cpp文件的第一行一般也是#include"*.h"文件,其实也相当于把*.h文件里的东西复制到*.cpp文件的开头。所以,你全部写在*.cpp文件其实也是一样的。

除了编程规范外,还涉及到类一个重要性质,就是封装性。比如现在我们公司和另一家软件公司合作,这样就必然要互相提供一些软件的信息(比如一些类,它到底是要做什么的),可是在提供这些信息的同时我们又不像让对方知道我们这些类的具体实现,毕竟这些是我们公司的算法核心和心血啊。所以这个时候就可以把类的接口(这个类是要做什么的)放在*.h文件中,而具体类的实现放在 *.cpp文件。这时候我们只要给对方公司*.h文件就行了。这样既提供了必要的信息,又保护了我们的核心代码。

 

最表面的机制是:

头文件是程序的界面(是代码界面),提供给程序员以  类、模版、函数等一系列的声明,让程序员知道应该怎么调用里面的“东西”。

从动态链接库的角度看:

头文件提供界面,使得程序员在需要加载一个库函数的时候(这里也仅仅是举简单的例子)查看头文件就知道怎么加载这个动态库内部的函数。

 

从软件的扩展来说:

将头文件作为界面,再去定义它的实现,这样只要保证界面不变(头文件不变),就可以只修改实现文件,而不必修改其他的实现代码。比如你有一个sort()函数来排序,在一个大程序中,你后来发现这个sort()有更好的算法,于是你只需要去修改函数的实现(修改.cpp文件的sort()函数的代码),其他使用这个函数的地方可以完全保持不变,这是分割技术的第一个好处。

 

从模块性来讲:

界面后面隐藏实现代码,代码具有更好的物理模块性,减小程序的复杂度。 

 

从编译的角度看:

所有源文件都是被编译器分别划分单元来分别编译,在编译的过程中,头文件被嵌入到实现文件里面一起作为一个编译单元被编译(实现文件filename.cpp里的

#include "filename.h"

那一行被替换成filename.h里面的所有内容(实际上会把预处理指令去掉,这才是预处理最本质的作用))。

举一个简单的例子,你定义了sort()函数,在test.h头文件里声明,在test.cpp里定义,这个时候在test.cpp里面#include "test.h",并定义sort)()函数。

你需要在头文件内部写预处理代码

#ifndef _TEST_H_

#define _TEST_H_

 

#endif

预处理指令防止头文件被多重包含,如果你的代码出现了诡异的错误,请注意这个问题,可能是你没有写头文件保护,在符号链接阶段链接器发现有多个相同的名字,它不知道应该跟哪一个符号链接在一起,所以报错。 

 

从节约时间的角度看:

在一些大型项目里面,编译一个项目不是整个一起同时编译的,一般情况是分别交给几个负责人去编译,测试,最后链接起来。如果中间发现有一个实现文件有BUG,只需要修改这个.cpp文件,其他的文件就可以原封不动。

再重新编译的时候,只需要单独便宜修改过的这一块,其他的部分不动。然后再链接成可执行程序。

这种机制在一个可能完整编译需要花费超级计算机几天时间的项目上是非常有用的,想一下,没有这种机制,要是一个程序随便修改一个地方。这个程序就要花几天时间来编译,这事情,怎么了得?

 

使用连接器的两个原因:

1.编译成目标文件的时候代码的内部符号被编译器修改过。

2.目标文件被组织成一个整的大型文件,所有符号被定位,保证每一个函数调用都找得到他本身的定义位置 


1、.h和.cpp差不多就像书和目录的关系,目录中对书中的章节和内容进行简单表示,真正的实现是在书里面的。 一般的数据,数据结构,接口,还有类的定义放在.h文件中,可以叫他们头文件,可以#include 到别的文件中。功能实现一般都放在具体的.cpp文件中,这样方便文件管理,节约时间,提高效率。

  
  2、本质上是没有什么区别的,.h文件实现的功能是声明本文件或.cpp文件中需要被别人使用或知道的变量、类型、函数及宏定义等。.h文件就像是一个接口,具体的实现可以在.cpp中也可以在.h中。.cpp中的函数或变量即便是全局的,在没有其他.cpp文件使用的情况下,也可以不写在.h中。
  (就像conn.asp,共享使用,方便改动)
  
  首先,我们可以将所有东西都放在一个.cpp文件内.然后编译器就将这个.cpp编译成.obj编译单元了.
  
  一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序),组成一个.exe,也就是程序了.
  
   链接器将所有的obj连接起来,但是如果碰巧有相同的函数或外部变量怎么办?他如何识别?
  
  一般来说是不能允许在同一个程序中,出现两个一样的函数名或外部变量名.
  
   但是只得庆幸的是,c++可以通过一种叫做链接属性的关键字来限定,你这个函数是属于整个程序
  
  公用的,还是只是在一个编译单元obj里面使用的.
  
   这些关键字就是extern 和 static; extern是外部链接的意思,也就是除了这个单元,外部的单元
  
  也是能够访问这个函数的.static 是内部链接,自属于自己单元.
  
  说了这么久,还没有说.h的作用呢?
  
   其实没有.h也能很好的工作,但是当你发现一个外部链接的函数或外部变量,需要许多份
  
  声明,因为c++这种语言,在使用函数和变量的时候,必须将他声明,为何要声明?声明之后才
  
  知道他的规格,才能更好的发现不和规格的部分.你别妄想一个编译单元,会自动从另一个
  
  编译单元那里得到什么信息,知道你是如何定义这个函数的.
  
   所以说,只要使用到该函数的单元,就必须写一份声明在那个.cpp里面,这样是不是很麻烦,
  
  而且,如果要修改,就必须一个一个修改.这真让人受不了.
  
  
  .h就是为了解决这个问题而诞生,他包含了这些公共的东西.然后所有需要使用该函数的.cpp,只需要
  
  用#include包含进去便可.以后需要修改,也只是修改一份内容.
  
  
  请注意不要滥用.h,.h里面不要写代码,.h不是.cpp的仓库,什么都塞到里面.
  
  如果在里面写代码,当其他.cpp包含他的时候,就会出现重复定义的情况,
  
  比如将函数func(){printf};放到头文件a.h,里面还有一些a.cpp需要的声明等;
  
  然后你发现b.cpp需要用到a.cpp里面的一个函数,就很高兴的将a.h包含进来.
  
  注意,#include并不是什么申请指令,他就是将指定的文件的内容,原封不动的拷贝
  
  进来.
  
  
  这时候实际上a.cpp和b.cpp都有一个func()函数的定义.
  
  如果这个函数是内部链接static的话,还好,浪费了一倍空间;
  
  如果是extern,外部链接(这个是默认情况),那么根据在同一个程序内不可出现
  
  同名函数的要求,连接器会毫不留情给你一个连接错误!
  
  
  (编译器对每个CPP单独链接,因此就会涉及某些定义在不同程序中反复使用)

  (就当盖房子、装修,与实际生活在房子中一样)


原文:http://blog.sina.com.cn/s/blog_5d636bc60100nhk9.html

http://blog.tianya.cn/blogger/post_read.asp?BlogID=696348&PostID=47169122

2015-07-02 14:27:00 weixin_30918415 阅读数 8
  • 20150613.CPP语言

    尹成讲师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!

    6864 人正在学习 去看看 尹成

如果你在工程里拉入.c/.cpp文件就会导致工程报错, 现在有两种解决方式

1. 把.c文件的后缀全部改成.m的后缀

 把.cpp文件的后缀改成.mm的后缀

 

2. 使用 工程名-Prefix.pch

并在工程->targets->build settings 

Apple LLVM 6.1 - Language 下

    Precompile prefix header   YES

    Prefix Header         $(PROJECT_NAME)/工程名-Prefix.pch 

然后新增 工程名-Prefix.pch 文件

然后在文件内容 写在 下面 格式 中间

#ifdef __OBJC__

...

#endif

 

转载于:https://www.cnblogs.com/apem/p/4615973.html

2019-01-06 10:53:13 li198847 阅读数 136
  • 20150613.CPP语言

    尹成讲师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!

    6864 人正在学习 去看看 尹成

文件区别:

.h :头文件。头文件包含类,类型,函数和常数的声明。

.m :源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。

.mm :源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名

.cpp:只能编译C++

当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使用#import。

.m 和.mm 的区别是告诉gcc 在编译时要加的一些参数。当然.mm还可以命名成.m,但在编译时要手动加参数(麻烦)

常用场景:

如果你的OC代码里面有包含C++的引用或代码,将此类更改为.mm即可;

例子:

ERROR:./zxing/cpp/core/src/zxing/common/Counted.h:21:10: 'iostream' file not found

在引用zxing的时候#import用到了iostream,但是它是/iphoneOS6.1/user/include/c++下面的类,故需要把类名改为.mm即可

注意#import或#include的位置要在.mm文件里,如果在.h头文件里是没用的



作者:VincentHK
链接:https://www.jianshu.com/p/5a83a5a503fe
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

2019-03-02 10:54:18 m0_38101326 阅读数 56
  • 20150613.CPP语言

    尹成讲师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!

    6864 人正在学习 去看看 尹成
// floatnum.cpp -- floating-point types
#include <iostream>
int main()
{
    using namespace std;
    cout.setf(ios_base::fixed, ios_base::floatfield);

    float tub = 10.0 / 3.0;
    double mint = 10.0 / 3.0;
    const float million = 1.0e6;

    cout << "tub = " << tub;
    cout << ", a million tubs = " << million * tub;
    cout << ",\nand ten million tubs = ";
    cout << 10 * million * tub << endl;

    cout << "mint = " << mint << " and a million mints = ";
    cout << million * mint << endl;

    return 0;
}

输出:

tub = 3.333333, a million tubs = 3333333.250000,
and ten million tubs = 33333332.000000
mint = 3.333333 and a million mints = 3333333.333333
默认情况下,像8.24和2.4e8这样的浮点数常量是属于double类型的。如果希望常量是float类型,请使用f或F后缀,如1.23f和2.35e20F。

 

2007-11-08 23:50:00 CCodes 阅读数 271
  • 20150613.CPP语言

    尹成讲师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!

    6864 人正在学习 去看看 尹成

 <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1194442938015&lmt=1194190197&format=336x280_as&output=html&correlator=1194442937843&url=file%3A%2F%2F%2FC%3A%2FDocuments%2520and%2520Settings%2Flhh1%2F%E6%A1%8C%E9%9D%A2%2FCLanguage.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=583001034.1194442938&ga_sid=1194442938&ga_hid=1942779085&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"></iframe> #include <iostream.h>

void main(void)
 {
   cout.setf(ios::uppercase | ios::scientific);
   cout << 100.12;
   cout.unsetf(ios::uppercase);
   cout << endl << 100.12;
 }

 

show_hex.cpp

阅读数 232

没有更多推荐了,返回首页