林锐: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)在程序的很多地方都用到同一个常量,用某一个宏常量来定义可以减少错误. 规则:尽可能的使用含义直观明确的常量来表示程序中多次出现的 ...
随机推荐
- 豆瓣模拟登录(双层html)
一.豆瓣模拟登录(双层html) #!/usr/bin/env python # -*- coding: utf-8 -*- #author tom import time from selenium ...
- Python基础 (下)
参考:菜鸟教程 目录 一.读写文件 二.错误和异常 三.XML和JSON解析 四.类 五.Python高级教程 一.读写文件 1. 打开文件: open(filename, mode). mode有 ...
- qs.parse() 和 qs.stringfy() 之 传输数据秘籍
qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装. 1. qs.parse()将URL解析成对象的形式 const Qs = require('qs');let url ...
- $bzoj1052-HAOI2007$ 覆盖问题 抽屉原理 二分答案
题面描述 某人在山上种了\(N\leq 2*10^4\)棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用\(3\) ...
- Xlua文件在热更新中调用方法
Xlua文件在热更新中调用方法 public class news : MonoBehaviour { LuaEnv luaEnv;//定义Lua初始变量 void Awake() { luaEnv ...
- Oracle 基础系列之1.2 oracle的基本使用
在1.1的安装过程完成之后,进入第二部分,oracle的基本使用,在使用前,首先测试下,oracle是否安装成功,以及检查oracle的关键服务时候开启 1.首先测试下,oracle是否安装成功 打开 ...
- java的访问修饰符
Java中通过访问控制符(default,private,public,protected)来控制对类.变量.方法.构造方法的访问. 下表说明了4中修饰符的访问权限: 修饰符 当前类 同一包内 子孙类 ...
- 10 Linux DIG Command Examples for DNS Lookup--reference
by RAMESH NATARAJAN on FEBRUARY 29, 2012 http://www.thegeekstuff.com/2012/02/dig-command-examples/ D ...
- [转]微信小程序安全浅析
本文转自:http://blog.csdn.net/baize_security/article/details/54582854 引言 近期微信小程序重磅发布,在互联网界掀起不小的波澜,已有许多公司 ...
- 上下文(Context)和作用域(Scope)
函数的每次调用都有与之紧密相关的作用域和上下文.从根本上来说,作用域是基于函数的,而上下文是基于对象的. 换句话说,作用域涉及到所被调用函数中的变量访问,并且不同的调用场景是不一样的.上下文始终是th ...