第一篇:头文件总结
C、传统 C++
#include
//设定插入点
#include
//字符处理
#include
//定义错误码
#include
//浮点数处理
#include
//文件输入/输出
#include
//参数化输入/输出
#include
//数据流输入/输出
#include
//定义各种数据类型最值常量
#include
//定义本地化函数
#include
//定义数学函数
#include
//定义输入/输出函数
#include
//定义杂项函数及内存分配函数
#include
//字符串处理
#include
//基于数组的输入/输出
#include
//定义关于时间的函数
#include
//宽字符处理及输入/输出
#include
//宽字符分类
//////////////////////////////////////////////////////////////////////////
标准 C++(同上的不再注释)
#include
//STL 通用算法
#include
//STL 位集容器
#include
//复数类
#include
#include
//STL 双端队列容器
#include
//异常处理类
#include
#include
//STL 定义运算函数(代替运算符)
#include
#include
//STL 线性列表容器
#include
//STL 映射容器
#include
#include
//基本输入/输出支持
#include
//输入/输出系统使用的前置声明
#include
#include
//基本输入流
#include
//基本输出流
#include
//STL 队列容器
#include
//STL 集合容器
#include
//基于字符串的流
#include
//STL 堆栈容器
#include
//标准异常类
#include
//底层输入/输出支持
#include
//字符串类
#include
//STL 通用模板类
#include
//STL 动态数组容器
#include
C++ 增加
#include
//复数处理
#include
//浮点环境
#include
#include
//布尔环境
#include
//整型环境
#include
//通用类型数学宏
第二篇:51头文件书写而方法
51单片机C语言学习笔记7:关于.c文件和.h文件
2009-09-15 09:55:43| 分类:| 标签: |举报 |字号大中小 订阅
1)h文件作用方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明;提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h)。
2)h文件里应该有什么
常量,结构,类型定义,函数,变量申明。
3)h文件不应该有什么
变量定义, 函数定义。
4)extern问题
对于变量需要extern;
对于函数不需要因为函数的缺省状态是extern的.如果一个函数要改变为只在文件内可见,加static。
5)include包含问题
虽然申明和类型定义可以重复,不过推荐使用条件编译。
#ifndef _FILENAME_H,#define _FILENAME_H
……
#endif
6)应该在那儿包含h文件
在需要的地方.比如某个提供接口的h文件仅仅被1.c文件需要,那么就在1.c文件里包含。编写的程序一般会有.H文件和相对应的.C文件,.H文件是声明所用,.C文件是其函数实现部分。在调用时只要包含.H文件即可,我们没有听说过#include “delay.c”这类的程序,同时也不提倡使用这个形
式。
在delay.h文件中: //对调用的函数声明
#ifndef __DELAY_H__
#define __DELAY_H__
extern void Delayms(unsigned int n);
#endif
在delay.c文件中: //函数实现部分
#include
//for crystal 11.0592M
void Delayms(unsigned int n)
{
unsigned int i,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);
}
在主程序main.c中
#include
……
上述方法仍然要求每建立一个工程就需要把对应的头文件复制到工程的文件夹里,这样看来仍然是比较麻烦的,这时还有另外一中方法就是将做好的头文件放在一个文件夹中,然后将这个文件夹整体拷贝到..KEILC51INC下面,以后若需要使用某个头文件,就如使用KEIL自带的头文件一样方便了,在主函
数mani()之前有一句#include 就可以在main()中使用其中的函数了。
参考资料:
1)h文件里变量(函数)申明用不用extern
2).c文件和.h文件的概念与联系
3)过马路,左右看
4).c 和.h文件的不同
5)C51包含头文件方法
防止头文件重复包含的方法
第一条预处理命令是说,如果MAXMIN_H不为真,说明此文件没被包含过,此命令后面的源代码有效(相当于:‘如果大门没关,请您进来’);
第二条预处理命令把MAXMIN_H置为真(相当于请您把门锁插上,不让第二个人进来)。最后一条预处理命令是为了标出接受上述处理的源程序的范围(相当于您已经走到了后门)。假定有以下几个头文件及其包含关系为:
File1.h,file2.h,file3.h,file4.h,file5.h,main.cpp
那么:file3.h包含file1.h,file2.h,file4.h包含file1.h,file2.h,file5.h包含file3.h,file4.h。就会导致在file5中对file1和file2的反复包含,编译时就会报错。
解决方法1:
1:应用#ifndef
#define
#endif
即每个文件在定义时都写成以下情势(以file1.h为例):
#ifndef H_FILE1
#define H_FILE1
#include
#include
…..#endif
File3.h:
#ifndef H_FILE3
#define H_FILE3
#include
#include
#inlcude”file1.h”#include”file2.h”…..#endif
方法二:在每个文件的头部定义:#pragmaonce(用于解释本文件中的内容只应用一次)例:fiel1.h:
#pragmaonce#include
#pragmaonce#include
第三篇:http头文件分析心得体会
http头文件分析心得体会
一、http简介
HTTP即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(“,结果称为 HA2。
3、对HA1、服务器密码随机数(nonce)、请求计数(nc)、客户端密码随机数(cnonce)、保护质量(qop)以及 HA2 的合并值计算 MD5 哈希值。结果即为客户端提供的
response 值。
因为服务器拥有与客户端同样的信息,因此服务器可以进行同样的计算,以验证客户端提交的 response 值的正确性。在上面给出的例子中,结果是如下计算的。
(MD5()表示用于计算MD5哈希值的函数;“”表示接下一行;引号并不参与计算)
HA1 = MD5(”Mufasa:testrealm@host.com:Circle Of Life“)
= 939e7578ed9e3c518a452acee763bce9 HA2 = MD5(”GET:/dir/index.html“)
= 39aff3a2bab6126f332b942af96d3366 Response = MD5(”939e7578ed9e3c518a452acee763bce9:
dcd98b7102dd2f0e8b11d0f600bfb0c093: 00000001:0a4f113b:auth: 39aff3a2bab6126f332b942af96d3366“)= 6629fae49393a05397450978507c4ef1 此时客户端可以提交一个新的请求,重复使用服务器密码随机数(nonce)(服务 器仅在每次“401”响应后发行新的nonce),但是提供新的客户端密码随机数(cnonce)。在后续的请求中,十六进制请求计数器(nc)必须比前 一次使用的时候要大,否则攻击者可以简单的使用同样的认证信息重放老的请求。由服务器来确保在每个发出的密码随机数nonce时,计数器是在增加的,并拒 绝掉任何错误的请求。显然,改变HTTP方法和/或计数器数值都会导致不同的 response值。
服务器应当记住最近所生成的服务器密码随机数nonce的值。也可以在发行每一个密码随机数nonce后,记住过一段时间让它们过期。如果客户端使用了一个过期的值,服务器应该响应“401”状态号,并且在认证头中添加stale=TRUE,表明客户端应当使用新提供的服务器密码随机数nonce重发请求,而不必提示用户其它用户名和口令。
服务器不需要保存任何过期的密码随机数,它可以简单的认为所有不认识的数值都是过期的。服务器也可以只允许每一个服务器密码随机数nonce使用一次,当然,这样就会迫使客户端在发送每个请求的时候重复认证过程。需要注意的是,在生成后立刻过期服务器密码随机数nonce是不行的,因为客户端将没有任何机会来使用这个nonce。
语法:
challenge
= ”Digest“ digest-challenge
digest-challenge = 1#(realm | [ domain ] | nonce |
[ opaque ] |[ stale ] | [ algorithm ] |
[ qop-options ] | [auth-param])
domain
= ”domain“ ”=“ <”> URI(1*SP URI)<“>
URI
= absoluteURI | abs_path
nonce
= ”nonce“ ”=“ nonce-value
nonce-value
= quoted-string
opaque
= ”opaque“ ”=“ quoted-string
stale
= ”stale“ ”=“(”true“ | ”false“)
algorithm
= ”algorithm“ ”=“(”MD5“ | ”MD5-sess“ |
token)
qop-options
= ”qop“ ”=“ <”> 1#qop-value <“>
qop-value
= ”auth“ | ”auth-int“ | token
realm:让客户知道使用哪个用户名和密码的字符串。不同的领域可能密码不一样。至少告诉用户是什么主机做认证,他可能会提示用哪个用户名登录,类似一个Email。
domain:一个URI列表,指示要保护的域。可能是一个列表。提示用户这些URI采用一样的认证。如果为空或忽略则为整个服务器。nonce:随机字符串,每次401都不一样。跟算法有关。算法类似Base64加密:time-stamp H(time-stamp ”:“ ETag ”:“ private-key)。time-stamp为服务器时钟,ETag为请求的Etag头。private-key为服务器知道的一个值。
opaque:服务器产生的由客户下去请求时原样返回。最好是Base64串或十六进制字符串。
auth-param:为扩展用的,现阶段忽略。
其他域请参考RFC2617。
授权头语法:
credentials
= ”Digest“ digest-response
digest-response = 1#(username | realm | nonce | digest-uri
| response | [ algorithm ] | [cnonce] |
[opaque] | [message-qop] |
[nonce-count] | [auth-param])
username
= ”username“ ”=“ username-value
username-value = quoted-string
digest-uri
= ”uri“ ”=“ digest-uri-value
digest-uri-value = request-uri;As specified by HTTP/1.1
message-qop
= ”qop“ ”=“ qop-value
cnonce
= ”cnonce“ ”=“ cnonce-value
cnonce-value
= nonce-value
nonce-count
= ”nc“ ”=“ nc-value
nc-value
= 8LHEX
response
= ”response“ ”=“ request-digest
request-digest = <”> 32LHEX <“>
LHEX
= ”0“ | ”1“ | ”2“ | ”3“ |
”4“ | ”5“ | ”6“ | ”7“ |
”8“ | ”9“ | ”a“ | ”b“ |
”c“ | ”d“ | ”e“ | ”f“
response:加密后的密码
digest-uri:拷贝Request-Line,用于Proxy cnonce:如果qop设置,才设置,用于双向认证,防止攻击。
nonce-count:如果服务器看到同样的计数,就是一次重放。
示例:
401响应:
HTTP/1.1 401 Unauthorized
www.xiexiebang.comonce=”0a4f113b“,response=”6629fae49393a05397450978507c4ef1“,opaque=”5ccc069c403ebaf9f0171e9517f40e41"
一,用摘要保护密码
摘要认证的一个改进之处是用摘要代替密码的传输,遵循的基本原则是“绝对不通过网络发送明文密码”,而是发送一个密码的摘要信息,并且这摘要信息是不可逆 的,即无法通
过摘要信息反推出密码信息。而服务器本身是存储这个密码的(实际上,服务器只需知道密码的摘要即可),而客户端和服务器本身都知道这个密码。这样的话,服 务器可以读取客户端的摘要和本身知道的密码进行同样计算得出的摘要进行比较,若匹配,则验证通过。
摘要是对信息主体的浓缩,摘要是一种单向函数,主要用于将无限的输入值转为有限的浓缩输出值,如MD5,则是将任意长度的字节系列转换为一个128位的摘要。MD5输出的128位的摘要通常会写出32个十六进制的字符,每个字符表示4个bit。
二,用随机数防止重放攻击
使用单向摘要就无需以明文形式发送密码了,可以只发送密码的摘要,并且可以确信,没有哪个恶意用户能轻易的从摘要中解码出原始密码。
但是,摘要被截获也可能跟密码一起好用,为了防止重放攻击的发送,服务器可以向客户端发送一个称为随机数nonce的特殊令牌,这个数会经常发生变化(可 能是每毫秒,或者每次认证都发生变化,具体由服务器控制),客户端在计算摘要之前要先将这个随机数附加到密码上去。这样,在密码中加入随机数就会使得摘要 随着随机数的每次变化而变化,记录下的密码摘要只对特定的随机数有效,而没有密码的话,攻击者就无法计算出正确的摘要,这样就可以防止重放攻击的发生。
摘要认证要求使用随机数,随机数是在www.xiexiebang.comonce。如下例子:
GET/cgi-bin/checkout?a=b HTTP/1.1 Authorization: Digest username=”tenfyguo”
realm=”test realm”
nonce=” 66C4EF58DA7CB956BD04233FBB64E0A4” //服务器端的随机数一起带回
uri=”/cgi-bin/checkout?a=b” //必须跟请求行一致
qop=”auth” //保护质量参数
nc=0000001
cnonce=”xxxxx234132543strwerr65sgdrftdfytryts” //客户端随机数,用于对称校验
response=” ABC4EF58DA7CB956BD04345FBB64E0A4”//最终摘要
3,服务接受摘要,选择算法以及掌握的数据,重新计算新的摘要跟客户端传输的摘要进行比较,验证是否匹配,若客户端反过来用客户端随机数对服务器进行质询,就 会创建客户端摘要,服务可以预先将下一个随机数计算出来,提前传递给客户端,通过Authentication-Info发送下一个随机数。如下例子:
HTTP/1.1 200 OK Authorization-Info:nextnonce=” 88C4EF58DA7CB956BD04233FBB64E0A4”
qop=”auth”
rspauth=”23543534DfasetwerwgDTerGDTERERRE”
cnonce=” xxxxx234132543strwerr65sgdrftdfytryts”
四,摘要的计算
在说明如何计算摘要之前,先说明参加摘要计算的信息块。信息块主要有两种:
1,表示与安全相关的数据的A1。
A1中的数据时密码和受保护信息的产物,它包括用户名,密码,保护域和随机数等内容,A1只涉及安全信息,与底层报文自身无关。
若算法是:MD5 则A1= 若算法是:MD5-sess 则A1=MD5( ): 2,表示与报文相关的数据的A2.A2表示是与报文自身相关的信息,比如URL,请求反复和报文实体的主体部分,A2加入摘要计算主要目的是有助于防止反复,资源或者报文被篡改。 若qop未定义或者auth: A2= 下面定义摘要的计算规则: 若qop没有定义: 摘要response=MD5(MD5(A1): 若qop为auth: 摘要response=MD5(MD5(A1): 若qop为auth-int: 摘要response= MD5(MD5(A1): 五,随机数的生成 RFC2617建议采用这个假想的随机数公式: nonce = BASE64(time-stamp MD5(time-stamp “:” ETag “:” private-key))其中: time-stamp是服务器产生的时间戳或者其他不会重复的序列号,ETag是与所请求实体有关的HTTP ETag首部的值,priviate-key是只有服务器知道的数据。 这样,服务器就可以收到客户端的认证首部之后重新计算散列部分,如果结果与那个首部的随机数不符,或者是时间戳的值不够新,就可以拒绝请求,服务器可以通过这种方式来限制随机数的有效持续时间。 包括了ETag可以防止对已经更新资源版本的重放请求。注意:在随机数中包含客户端IP,服务器好像就可以限制原来获取此随机数的客户端重用这个随 机数了,但这会破坏代理集群的工作,使用代理集群时候,来自单个用户的多条请求通常会经过不同的代理进行传输,而且IP地址欺骗实现起来也不复杂。 引言: 我们经常在c工程中发现,源文件中要包含自己的头文件。一直以来,都不知道为什么这样做。现在,我知道了。 以前的认知: 我认为,.c文件没有必要包含自己的.h文件。.h文件包含.c文件中定义的函数和全局变量的声明,.h文件就是.c文件提供的对外接口文件。既然.h文件就是.c文件提供的对外接口文件,那么.c文件就没必要包含自己的.h文件了(.h文件是对外提供用的,对内又何必再包含进来呢)。 鉴于这样的理解,我对于工程中.c源文件包含自己的.h头文件很是不理解,不知道为什么要这样做。 现在对此的理解: 但是现在,我知道为什么要源文件包含自己的头文件了。 如下,一段书中的原话: “如果希望让编译器检查声明的一致性, 一定要把全局声明放到头文件中。特别是, 永远不要把外部函数的原型(也就是函数声明)放到.c 文件中: 通常它与定义的一致性不能得到检查, 而矛盾的原型(也就是函数声明)比不用还糟糕。” 注意:外部函数的原型,就是外部函数的声明。 对这段话的理解: 为什么:“永远不要把外部函数的原型放到.c 文件中” 这个外部函数A指的是B.c文件之外定义的函数,B.c文件中需要使用外部函数A,就需要先对外部函数A声明(对外部函数的声明就是外部函数原型)。对这个外部函数A的声明,不能放在B.c文件里面来实现。 以实例说明: ① 假若工程中有2个源文件a.c和b.c;a.c的头文件为a.h,b.c的头文件为b.h。② a.c中定义了一个函数sum。 ③ b.c要引用sum 这个函数。做法是:在b.c中声明sum这个函数。然后b.c就可以使用sum函数了。 这样的做法就是把外部函数sum的声明放到了b.c中来。然而,这样的做法很不妥。不妥的原因:sum是在a.c中定义的,而声明确是在b.c中,sum函数的定义和声明不是在同一个文件中的。定义和声明不在同一个文件中,编译的时候,编译器就不能对定义和声明的一致性进行检查。这样,如果sum的定义和声明不一致,编译器就无法检查出来(定义和声明不在同一个文件中),那么编译的时候不会报错,但是程序运行的时候就可能会出错。而这样的错误,查找起来又不是很容易。 鉴于此,才这样说:“永远不要把外部函数的原型放到.c 文件中”。 那如何才能让编译器检查定义和声明的一致性呢? 前面说,如果把外部函数的原型放到.c 文件中,编译器就无法检查声明和定义的一致性(声明和定义不在同一个文件中)。那么,要让编译器检查定义和声明的一致性呢,自然是把定义和声明放在同一个文件中,而如何实现把定义和声明放在同一个文件里呢? 答案:源文件定义的函数,在源文件对应的头文件中声明,然后源文件包含自己的头文件。这样定义和声明就放在同一个文件里了。 援引上述例子:a.c中定义了函数sum,而函数本质上是外部的,函数sum是可以被其它源文件调用的。那么,我们把sum函数的声明放在a.h中。然后a.c源文件还要包含自己的头文件,也就是a.h文件。而b.c文件要引用sum函数,就直接包含a.h文件就可以。 sum函数的定义在a.c中,声明是在a.h中,但是由于a.c包含了a.h,所以sum的定义和声明就是在同一个文件a.c中了。这样,编译器编译的时候,就能对sum函数定义和声明的一致性做检查,如果不一致,就会报错。 至于其他源文件引用这个外部函数sum,不再采用直接声明的方式,而是通过包含a.h头文件的方式。 这样,编译器检查了sum函数定义和声明的一致性没有报错,也就表明a.c中sum函数的定义和a.h中sum 函数的声明是一致的。那么其他源文件都是通过直接包含a.h,来使用函数sum,就也保证了sum函数声明和定义的一致性了。结论 c源文件要包含自己的头文件,目的就是让编译器检查定义和声明的一致性。 拜访总结 这次我负责寻找拜访对象,刚开始我想采访学校里的清洁工,被组员否定,因为组员认为采访难度太低。后来我提议去拜访社会上的物流公司,又有组员认为难度太大。但一时间其他组员也没有想出其他的办法,所以我决定利用清明节假期,到社会上去尝试找物流公司进行采访,毕竟我们所学的专业是物流管理,多多少少会对我们有用。 人不接受采访怎么办?等了一会儿我就想外事都是开头难嘛,所以下一秒我果断地拨了广告牌上的服务热线,向接待人员说明了我的身份、我的意图,然后服务人员告诉了我他们老总的电话。接着我拨通了正天物流老总的电话,向他打过招呼之后,我同样说明了我的身份以及来意,他爽快地接受了采访。当我谈到采访时间时,他说他下个星期五就要出差了。所以我们只能把采访时间订在4月6号或者4月7号。 找到一个拜访对象后,我决定再找一个拜访对象。让我们每个组员都有机会去拜访。接着我又去找了好几家物流公司,不是电话打不通就是不愿意接受采访。 后来到学校与组员商量后,决定选在4月6号去采访,然后又与正天物流蒋总进行协商,将具体的采访时间订在4月6号下午1点半。然后我们组商量每个人想三个问题,最后我们精选了12个问题进行提问。考虑到去的人不能太多,也不能太少,又要兼顾男女比例,所以决定由我、王斌、莫亚飞和钱文欢前去拜访。第二天,也就是采访的这一天。王斌和莫亚飞临时有事没办法前去,我们组重新开了个小会,重新确定采访的人员:我、钱文欢、徐海香和李海梅。由于物流公司离我们学校比较远,所以我们上午一下课便出发前去正天物流。我们一点就到了正天物流,我们带上胸卡。我打了一个电话告诉他我们已经在门外了,经过许可后,我们便走进了这家物流企业。两边停着许多运输车辆,不时有叉车工在搬运货物。远处楼梯口有人向我们招手,我猜想一定是蒋总。在蒋总的招呼下,我们便一同走进了蒋总的办公室。刚一进去,蒋总就招呼我们坐下,我们感到十分亲切。接着我向蒋总介绍每个人的姓名,我们便开始了将近一个小时的采访。由于考虑到蒋总的工作很忙,采访完了,我们便要求和蒋总一起合了一张照片,便向蒋总道谢再见了。他和我们一起下了楼,当时下起了小雨,他没有撑伞,我们想帮他撑伞,但是被他谢绝了,我们再次向他道别。 之后我们便离开了正天物流公司,天虽然下着雨,可是我们很开心。 总结一:世上的事不会总一帆风顺的,如果事情顺利,也不要太高兴,因为可能别人比我们做得更好,像这次采访,也有小组采访到物流公司,还有小组采访到了五星电器,所以我们起点并不是太占据优势。如果事情不顺利,也不要灰心,因为我们尽力了,我们相信下次我们会做的更好。我们也会冷静地分析不顺利的原因,积极想办法去解决。总之,命运是掌握在我们自己手里的,我们一定要认真对待。 总结二:团队合作、团队力量很重要。在提问的问题上,我们组集中全组人智慧,让每个人都参与进来;在第二天去的人临时发生突发事件后,有组员主动请缨代替他们去,每一个人有较好的集体意识;在提问时,有一人专门负责进行一些笔记,其他三人进行提问,分工合理、高效。 总结三:蒋总告诉我们以后从事物流非常辛苦,所以我必须做好吃苦的准备。我想不管以后干什么,首先要有吃苦的精神。我也不喜欢经常更换职业,因为干啥行都是一样,重要的是敢于坚持下去,付出总会有结果的。蒋总还说,他说习惯很重要,所以他能坚持在物流岗位上9年多了。 总结四:要慢慢培养自己管理者的品质。蒋总向我们挥手的那一刻,我觉得他具有作为领导者的一种亲和力;蒋总为人很低调,不愿意和我们合影、衣着朴素;第四篇:C源文件要包含自己的头文件
第五篇:总结