c语言的头文件-不是c++类的头文件?
下面的概述是参考的这篇文章:http://blog.csdn.net/bingxx11/article/details/7771437
c语言编程中也有,也需要头文件,
头文件不只是C++的类才需要!
比如: c中的string.h, 内存操作的头文件 #include <mem.h>
即是: c语言中, 函数/变量的声明和实现, 也可以像c++一样,
头文件中, 哪些函数/变量需要使用extern来说明?
c语言有一个约定: 凡是在对应的.c文件中, 有那个函数的实现的, 就不加extern, 凡是没有对应实现的, 就需要加extern.
extern的解决,相当于一个口头承诺, 一个口头约定, 口头答应, 在linker连接时, 由连接器(链接器)自动去找.不用我们去管的!!
---------------------------------------------
exten的头文件如何区分"定义声明" - "引用声明"?
(引用自: http://blog.csdn.net/bingxx11/article/details/7771437)
两种方式:
1. 顶层声明中,存在初始化语句是,表示这个声明是定义声明,其他声明是引用声明。C语言的所有文件之中,只能有一个定义声明。按照这个模型,我们可以在first.h中定义如下TPYE G_test=1;那么就确定在first中的是定义声明,在其他的所有声明都是引用声明。
--------------------------------------------
C语言程序在内存中的存储区域:
代码区;
常量区;
全局/静态(变量)区;
堆区/自由存储区: malloc, free | new, delete
栈区(是一段公共内存区, 公共的: 是指所有的函数运行时,都是使用的这个区域, 这个区域被反复的使用,
前一个函数使用后, 退出时, "函数内的栈区被释放", 什么叫释放, 并没有内存清零这个动作,只是栈区
的栈顶指针退回到栈顶,下一次,另外一个函数执行时,仍然使用这个内存区, 而且,局部变量的值可能是上一次
函数运行时留下的值, 这个值的类型是各种各样的...但是由于字节数的长度不同, 所以组合起来的值,完全
不可控, 所以是随机的, 需要对其进行初始化)
关于函数的返回值问题?
返回值无非有两种: 一是返回地址的, 比如数组地址, 指针, 对象的地址, 也就是, 一般"非内部数据类型"
的返回值,最好用返回引用的方式;
另一种是返回拷贝传值类型的, 一般, 返回的是"内部/基本"数据类型的,用这个传值, 不要用传引用.
那么, 对于传值的函数 的返回值, 函数退出时, 其内存被回收, 也就是,程序无法引用得到, 那么这个值怎么传出来呢?
网上的说法, 我比较相信的一种是: "函数退出 时,将返回值拷贝到" eax" 这个cpu内的寄存器中, 后面的函数,你要
这个返回值, 你就去取, 你不要就算了, 但是过后的话,你就取不到,因为这个寄存器随时都可能被覆盖.
const 修饰函数?
修饰函数的返回值 const one_class_type * foo(..) , 表示这个函数的返回值是一个常量指针, 因此它的
返回值只能付给 同类型的const 指针变量, 不能付给非const的.. 因为要强制保证const变量的值不被
直接/甚至修改!
const修饰类的成员函数的动作: 这时const要放在函数的最后: type foo(...) const {....} , 它表示, foo函数不能修改它之外的成员变量, 但可以引用/调用外部的成员变量, 但是不能调用非const的成员函数.
------------------------------------------------
sizeof 和 strlen 的列出几个重要的区别:
1.sizeof是算符,strlen是函数。
2.sizeof可以用类型做参数(必须加括号)/普通变量,strlen只能用char*做参数,且必须是以''/0''结尾的。
sizeof还可以用函数做参数,比如:
short f();
printf("%d/n", sizeof(f()));
输出的结果是sizeof(short),即2。
3.strlen计算的是字符串的长度,sizeof计算的是变量使用的内存大小,不受里面存储的内容改变
4.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
5.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
6.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof归还全部数组的尺寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 。
6.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:
fun(char [8])
fun(char [])
都等价于 fun(char *)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsiged char *p1, int len)
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}
我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
c语言的头文件-不是c++类的头文件?的更多相关文章
- 在类的头文件里尽量少引入其它头文件 <<Effective Objective-C>>
与C 和C++ 一样,Objective-C 也使用"头文件"(header file) 与"实现文件"(implementation file)来区隔代码.用 ...
- c++ 一个cpp文件如何调用另一个cpp文件已经定义的类?我不想重复定义
文件test1.cpp有类class A;文件test2.cpp有类class B.如在test2.cpp中想用A:#include "test1.cpp" 当然一般的做法是将类的 ...
- C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? 这个feature叫做Export Template,即外名模板,它的作用在于使得模板代码可依照C/C++语言习惯,将模板声明和实现 ...
- ndk学习之c++语言基础复习----C++容器、类型转换、异常与文件流操作
继续来复习C++,比较枯燥,但是这是扎实掌握NDK开发的必经之路,不容小觑. 容器: 容器,就是用来存放东西的盒子. 常用的数据结构包括:数组array, 链表list, 树tree, 栈stack, ...
- 配置apue的头文件apue.h和unp的头文件anp.h
配置apue的头文件apue.h和unp的头文件anp.h 如果要使用gcc -g 来生成可调试文件一定要修改Make.defines.linux文件中的CFLAGS变量 修改为:CFLAGS=-an ...
- Effective Objective-C 2.0 — 第二条:类的头文件中尽量少引入其他头文件
第二条:类的头文件中尽量少引入其他头文件 使用向前声明(forward declaring) @class EOCEmployer 1, 将引入头文件的实际尽量延后,只在确有需要时才引入,这样就可以减 ...
- VS 2010不显示头文件源文件和所有以前分类的文件夹,*.h 和*.cpp都显示在同一个文件
打开VS后不显示头文件源文件和所有以前分类的文件夹,*.h 和*.cpp都显示在同一个文件 点击右图红色指示显示所有文件夹按钮,就能恢复.
- 用javah 导出类的头文件, 常见的错误及正确的使用方法
******************************************************************************** 用javah 导出类的头文件, 常见的 ...
- 于用cocoapods添加第三方库,并且cocoapods添加成功,但是却在任何一个文件上都导入不了头文件
关于用cocoapods添加第三方库,并且cocoapods添加成功,但是却在任何一个文件上都导入不了头文件,而且根本没有提示,即使手动打#import "xxxx.h"也报错xx ...
随机推荐
- 用scheme语言实现SPFA算法(单源最短路)
最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...
- split 方法的正确使用姿势
本文同步自我的个人博客:http://www.52cik.com/2015/11/02/split-skill.html 通过js获取 QueryString (location.search部分) ...
- python的闭包与装饰器
原文发表在我的博客主页,转载请注明出处 前言 如果把python当作脚本语言,每次就是写个几十行上百行来处理数据的话,装饰器也许不是很必要,但是如果要开发一个大型系统,装饰器是躲不开的,最开始体会ry ...
- unity3d 赛车游戏——复位点检测
一直没有时间写博客 昨天我的CarWaypoints插件也告一段落了 今年没回家,过年就我一个人 挺无聊的,那就休息一天写几篇博客吧 我的代码可能很少,但是思路很重要 希望不懂的朋友别只copy代码 ...
- C++成员权限控制(总结)
1) 前言 在我学习C++的过程中,类中成员的权限控制一直是比较头疼的一个点,一会public,一会又private,还有protected,再加点继承,而且又有公有继承.私有继承,保护继承,所以感觉 ...
- SQL温故系列两篇(二)
.Sql 插入语句得到自动生成的递增的ID值 Insert into Table(name,des,num) values(’ltp’,’thisisbest’,10); Select @@ident ...
- [bzoj 1027][JSOI2007]合金(解析几何+最小环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1027 分析: 首先因为一个合金的和为1,所以考虑2个材料合金能否合成一个需求合金的时候 ...
- Day10
会议讨论 628:今天是冲刺的最后一天了,好紧张好激动,我们组还有好些个功能没实现呢,感觉崩崩哒!还要实现选择不同的专业导入不同的课表呢. 601:在修改教师帐号信息的页面要有当密码格式.用户名格式等 ...
- nslog
今天有人问我怎么更好的使用nslog,打包的时候老注释 pch里加下面的代码就好了平时debug的时候打印,release后就不打印了 #ifdef DEBUG#define NSLog(...) N ...
- mysql-分页查询方案
一.直接使用limit最简单查询方法: , 在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引. 随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似: , 言 ...