林锐:5 C++/C程序的基本概念
5.1.1
main
不能重载
不能内联
不能定义为static
不能取其地址
不能由用户直接调用
5.1.3内部名称
struct Sample_1
{
int count;
};
struct Sample_2
{
int count;
};
区分两个struct的同名成员count:“通过它们各自的对象和成员标识符就可以区分”,但是这只是源代码级或者说是形式上的区别。
对于语言来说,这两个同名成员代表两块不同的内存单元,而名字则是引用这两块内存单元的别名,因此为了区分开不同的内存单元就必须区分开他们的别名。否则连接时就会导致二义性,解决的办法就是Name-Mangling(在他们面前分别添加所属的类型的名称作为前缀,如_Sample_1_count)
5.1.4
声明:就是向系统介绍名字(而一个名字就是一块内存区的别名),告诉编译器这个名字的值的类型及宣告该名字的存在性,仅此而已。名字的类型有两个用途:一是用于静态类型检查,二是教导编译器如何解释它所代表的内存区(大小),以便为其引用语句生成合适的目标代码。例如函数原型就是告诉编译器该函数已经在程序的某个范围(其被定义的源文件或库)中定义了,因此其调用语句被转换为一条call指令。声明只为编译器所使用,因此不会生成目标代码,当然也需要给它分配存储空间,更不会增大可执行程序的体积。
定义:分配空间。对于变元(变量和对象)编译器确定它应该占用多少存储单元,并在虚拟地址空间中产生存放它的内存空间;对于函数,编译器为之生成可执行代码,并为其分配内存空间。类型定义、内联函数定义等不在此列。
由于声明并不会分配存储,因此只要你需要,同一个声明可以在整个程序中出现任意次,这就是重复声明。例如,每包含一个头文件,实际上是将其中的名字多声明一次,因为他们是内链接的。
但是定义不同,因为一个名字只能分配一次存储空间,否则不仅浪费空间而且会造成二义性,所以只能定义一次,这就是一次定义规则(ODR)。这也是我们建议不要把函数定义,变量定义放在头文件的原因之一(另一个原因是他们是外链接的)
林锐:5 C++/C程序的基本概念的更多相关文章
- 重读金典------高质量C编程指南(林锐)-------第二章 程序的板式
2.1 空行 规则1:在每个类声明之后,每个函数定义结束之后加空行. 规则2:在某个函数体内,相关的不加空行,不相关的加空行. // 空行 void Function1(-) { - } // 空行 ...
- 高质量C++/C编程指南(林锐)
推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐 2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐 20 ...
- 硬盘上的一些算法小题目||and今天看了下林锐的书以及gdb调试 及一些变成算法小题目
gdb调试:观察点,断点,事件捕捉点.step 进入函数,next 跳过函数,until 跳出循环,finish 结束函数 林锐:书后试题 & c++的对象模型图 看了二叉树的非递归遍历, 链 ...
- 林锐书:写一个hello world by seasoned professional
#include <iostream> #include <string.h> using namespace std; class String { private: int ...
- 林兴爆料小程序很快可以支持各个 App 直接打开小程序
在微信开放平台基础高级产品经理林兴演讲的当场,他爆料了微信小程序一个轰动性新能力:小程序很快可以支持各个 App 直接打开小程序!没错,你没有听错,简单来说,在不久以后,所有的 App 里面都可以看到 ...
- C++专题 - 修练8年C++面向对象程序设计之体会 林锐
六年前,我刚热恋“面向对象”(Object-Oriented)时,一口气记住了近十个定义.六年后,我从几十万行程序中滚爬出来准备写点心得体会时, 却无法解释什么是“面向对象”,就象说不清楚什么是数学那 ...
- 指针参数的传递(节选 C++/C 高质量编程 林锐)
指针参数是如何传递内存的 如果函数的参数是一个指针,不要指望用该指针去申请动态内存.示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是 ...
- 重读金典------高质量C编程指南(林锐)-------第七章 内存管理
2015/12/10补充: 当我们需要给一个数组返回所赋的值的时候,我们需要传入指针的指针.当我们只需要一个值的时候,传入指针即可,或者引用也可以. 结构大致如下: char* p = (char*) ...
- 重读金典------高质量C编程指南(林锐)-------第五章 常量
5.1 为什么需要常量 1)为了便于用户理解,增加程序的可读性. 2)在程序的很多地方都用到同一个常量,用某一个宏常量来定义可以减少错误. 规则:尽可能的使用含义直观明确的常量来表示程序中多次出现的 ...
随机推荐
- [转] 运维小技巧:使用ss命令代替 netstat,和netstat说再见
[From] https://blog.csdn.net/fenglailea/article/details/51810977 ss是Socket Statistics的缩写. 顾名思义,ss命令可 ...
- 【研究】curl测试不安全的HTTP请求
漏洞名称: 启用了不安全的HTTP方法 安全风险: 可能会在Web 服务器上上载.修改或删除Web 页面.脚本和文件. 可能原因: Web 服务器或应用程序服务器是以不安全的方 ...
- jar 启动关闭
1.后台启动 startTest.sh #设置工程路径project_path=/root/testcd $project_path#nohup后台启动,输出日志到test.lognohup java ...
- PIE SDK波段合成
1.算法功能简介 波段合成功能主要用于将多幅图像合并为一个新的多波段图像(即波段的叠加打包,构建一个新的多波段文件),从而可根据不同的用途选择不同波长范围内的波段合成 RGB 彩色图像. PIE支持算 ...
- harbor 仓库搭建
一,介绍 Harbor是一个用于存储Docker镜像的企业级Registry服务. Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry ...
- (转)用shell脚本实现杨辉三角的4个实例!
概述: 中国古代数学家在数学的许多重要领域中处于遥遥领先的地位.中国古代数学史曾经有自己光辉灿烂的篇章,而杨辉三角的发现就是十分精彩的一页.杨辉三角形,是二项式系数在三角形中的一种几何排列.杨辉 ...
- TOJ 2711 Stars
描述 Astronomers often examine star maps where stars are represented by points on a plane and each sta ...
- java多线程之线程组与线程池
看这篇文章:http://blog.csdn.net/zen99t/article/details/50909099
- Oracle11gExpress和PL/SQL Developer安装
Oracle11g为64位版本,PL/SQL Developer为32位版本 1.安装64为Oracle数据库/ 适用于 Microsoft Windows (x64) 的 Oracle Databa ...
- BNU34067——Pair——————【找规律】
Pair Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: M ...