zoukankan      html  css  js  c++  java
  • 林锐: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)。这也是我们建议不要把函数定义,变量定义放在头文件的原因之一(另一个原因是他们是外链接的)

  • 相关阅读:
    sql server 错误9003:LSN无效(日志扫描号无效),对数据库的修复.
    用C#调用C++DLL时的字符串指针参数传递问题
    sql server 2005中的Service broker小示例(未完善)
    水晶报表钻取数据,在明细层导的时候,报表会从新加载,并显示主报表
    [转]gridview获取当前行索引的方法
    验证视图状态 MAC 失败的解决办法
    SQL SERVER 2005中对存储过程进行签名(转)
    MSChart图表控件的一些使用
    Repository模式
    职能式管理和流程式管理
  • 原文地址:https://www.cnblogs.com/jeanschen/p/3408694.html
Copyright © 2011-2022 走看看