精华内容
下载资源
问答
  • 精品文档 可编辑版 常用修改符号使用方法及画法 1981 年 12 月我国发布了中华人民共和国专业校准GBI 一 81校对符号及其用法 该标准规定的符号共有 22 种常用的以上 15 种 一修改符号的作用 1.改正号:表明需要改正...
  • C++常用语法符号总结

    千次阅读 2018-02-09 22:23:03
    1.函数前面加了两个冒号--表示作用域,是域作用符,前面...这个符号是结构体运算符每一个结构体变量中的各个成员,都可以通过结构体成员运算符“.”或“->”来逐个访问。例如:定义一个结构体struct student{...

    1.函数前面加了两个冒号--表示作用域,是域作用符,前面没有带域名的是全局作用域。

    class A
    class B;
    void A::SetCurse();表示A类里的该函数
    void A::SetCurse();表示B类里的该函

    2.->这个符号是结构体运算符
    每一个结构体变量中的各个成员,都可以通过结构体成员运算符“.”“->”来逐个访问。
    例如:
    定义一个结构体
    struct student
    {
    char name[10];
    char number[10];
    float score;
    }stu1;
    然后访问其中成员,比如给成员赋值
    stu1.score=65.5;
    同样也可以写成
    stu1->score=65.5;

    结构体主要成员运算符有"."" ->"

    多用于修改结构成员的值。

    以下是具体的例子

    struct date{
     int year;
     int month;
     int day;
    };
    int main(int argc, char* argv[])
    {
     char end;
     struct date today;
     struct date* pdate;
     pdate=&today;
     today.year=2011;
     today.month=2;
     today.day=1;
     printf("year = %d\n\n",today.year);
     printf("month = %d\n\n",today.month);
     printf("day = %d\n\n",today.day);
     printf("year = %d\n\n",pdate->year);
     printf("month = %d\n\n",pdate->month);
     printf("day = %d\n\n",pdate->day);
    }

    Android中定义了两种智能指针类型,一种是强指针spstrong pointer),另外一种是弱指针(weak pointer)。强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。弱指针也指向一个对象但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,也就是说不能通过弱指针来调用对象的成员函数或访问对象的成员变量要想访问弱指针所指向的对象,需首先通过wp类所提供的promote()方法将弱指针升级为强指针。弱指针所指向的对象是有可能在其它地方被销毁的,如果对象已经被销毁,wppromote()方法将返回空指针,这样就能避免出现地址访问错的情况

    假设现在有一个类MyClass,如果要使用智能指针来引用这个类的对象,那么这个类需满足下列两个前提条件:

    1:这个类是基类RefBase的子类或间接子类;

    2:这个类必须定义虚构造函数,即它的构造函数需要这样定义:

    virtual ~MyClass();

    满足了上述条件的类就可以定义为Android智能指针了,定义方法和普通指针类似。比如普通指针是这样定义:

    MyClass* p_obj;

    智能指针是这样定义:

    sp<MyClass> p_obj;

    定义了一个智能指针的变量,就可以象普通指针那样使用它,包括赋值、访问对象成员、作为函数的返回值、作为函数的参数等。比如:

    p_obj = new MyClass(); // 注意不要写成 p_obj = new sp<MyClass> 
    sp<MyClass> p_obj2 = p_obj; 
    p_obj->func(); 
    p_obj = create_obj(); 
    some_func(p_obj);

    注意不要试图delete一个智能指针,即 delete p_obj。不要担心对象的销毁问题,智能指针的最大作用就是自动销毁不再使用的对象。不需要再使用一个对象后,直接将指针赋值为NULL即可:

    p_obj = NULL;

    上面说的都是强指针,弱指针的定义方法和强指针类似,但是不能通过弱指针来访问对象的成员。下面是弱指针的示例:

    wp<MyClass> wp_obj = new MyClass(); 
    p_obj = wp_obj.promote(); // 升级为强指针。不过这里要用.而不是->,真是有负其指针之名啊 
    wp_obj = NULL; 

    constC++才有的,和C语言的define一样也是用来定义常量的.

    即出现在const后面的是常量,是有地址的,可以用指针来指向那个常量值,但是不能修改它。

    status表示状态,是一个int类型typedef int status;或者#define status int

    实际上,在自定义中有typedef int Status ;也就是说Status是一个整数类型,这种类型的变量的值是反映函数结果状态的,它可能是OKERROR,等,而在宏定义中OK的值为1ERROR的值为0

    6.uint8_t / uint16_t / uint32_t /uint64_t  数据类型

    _t一个结构的标注,可以理解为type/typedef的缩写,表示它是通过typedef定义的,而不是其它数据类型。

    uint8_tuint16_tuint32_t等都不是什么新的数据类型,它们只是使用typedef给类型起的别名,新瓶装老酒的把戏。不过,不要小看了typedef,它对于你代码的维护会有很好的作用。比如C中没有bool,于是在一个软件中,一些程序员使用int,一些程序员使用short,会比较混乱,最好就是用一个typedef来定义,如:
    typedef char bool;

    一般来说,一个C的工程中一定要做一些这方面的工作,因为你会涉及到跨平台,不同的平台会有不同的字长,所以利用预编译和typedef可以让你最有效的维护你的代码。为了用户的方便,C99标准的C语言硬件为我们定义了这些类型,我们放心使用就可以了。

     按照posix标准,一般整形对应的*_t类型为:
    1字节     uint8_t
    2字节     uint16_t
    4字节     uint32_t
    8字节     uint64_t

    7.C语言第十七篇:size_t 数据类型

    size_t 类型表示C 中任何对象所能达到的最大长度。它是无符号整数,因为负数在这里没有意义。它的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度size_t 用做sizeof 操作符的返回值类型,同时也是很多函数的参数类型,包括malloc strlen在声明诸如字符数或者数组索引这样的长度变量时用size_t 是好的做法。它经常用于循环计数器、数组索引,有时候还用在指针算术运算上。

    size_t 的声明是实现相关的。它出现在一个或多个标准头文件中,比如stdio.h stblib.h,典型的定义如下:

    #ifndef __SIZE_T
    #define __SIZE_T
    typedef unsigned int size_t;
    #endif

    define 指令确保它只被定义一次。实际的长度取决于实现。通常在32 位系统上它的长度是32 位,而在64 位系统上则是64 位。一般来说,size_t 可能的最大值是SIZE_MAX

    通常size_t 可以用来存放指针,但是假定size_t 和指针一样长不是个好主意。稍后的使用sizeof 操作符和指针会讲到,intptr_t 是更好的选择。

    打印size_t 类型的值时要小心。这是无符号值,如果选错格式说明符,可能会得到不可靠的结果。推荐的格式说明符是%zu。不过,某些情况下不能用这个说明符, 作为替代,可以考虑%u %lu

    下面这个例子将一个变量定义为size_t,然后用两种不同的格式说明符来打印:
    size_t sizet = -5;
    printf("%d\n",sizet);
    printf("%zu\n",sizet);

    因为size_t 本来是用于表示正整数的,如果用来表示负数就会出问题。如果为其赋一个负数,然后用%d %zu 格式说明符打印,就得到如下结果:
    -5
    4294967291

    %d size_t 当做有符号整数,它打印出-5 因为变量中存放的就是-5%zu size_t 当做无符号整数。当-5 被解析为有符号数时,高位置为1,表示这个数是负数。当它被解析为无符号数时,高位的1 被当做2 的乘幂。所以在用%zu 格式说明符时才会看到那个大整数。

    正数会正常显示,如下所示:

    sizet = 5;

    printf("%d\n",sizet); // 显示5

    printf("%zu\n",sizet); // 显示5

    因为size_t 是无符号的,一定要给这种类型的变量赋正数

    8.void* 指针

    实可以理解为一个context,利用它可以很好的实现C语言面向对象编程。使用C/C++编程的人员看到void*,习惯性的就会认为——这是个私有数据,只有定义的一方才有权解释;这也是我们在回调函数中传递void*作为userdata的基础共识。

    void*指针其实可以用作泛型,你想象一下你在C中要交换两个变量,如果是两个整数的话,就像:

    void swap_int(int* lhs, int* rhs){

        int tmp = *lhs;

        *lhs = *rhs;

        *rhs = tmp;

    }

    如果要交换小数,那还要写一个

    void swap_float(float* lhs, float* rhs){

        ;//

    }

    那么既然都是把两个变量的bit pattern交换一下,那就可以把这种方法抽象出来:

    void swap(void* lsh, void* rhs){

        ;

    }

    因为你不知道究竟要交换多少个bit,所以,还需要一个参数来指定要交换的bit的数量:

    void swap(void* lsh, void* rhs, size_t size){

        ;//

    }

    有了这样一个函数,那么如果想要交换两个变量,那就可以:

    swap(&ai, &bi, sizeof(int));

    swap(&af, &bf, sizeof(float));

    void* 仅仅是为了看起来合乎逻辑

    但是,用回上面的例子,如果我用float*代替void*,那的确是可以的,但是我为什么每次调用它都要先做强制类型转换swap((float* )&ai, (float* )&bi, sizeof(int)),你把这样一个接口给另外的一个人使用,他会怎么想?我擦,你交换两个整数,还要先转换为float*,万一给个新手,人家还不敢用,我擦,你这里面有什么奥妙么?

    的确,void*和其他指针一样,都是占同样大小的内存空间,唯一和其他指针不同的就在于你不能对void*进行解引用,看起来其他类型的指针都可以用void*来代替,只要在解引用之前把它转换为相应类型的指针就OK了!

    9.C中声明指针要在每个变量前面加星号

    定义的时候 这个*就是用来表示指针的。
    比如
    int a; 这个是整型变量
    int *a; 这个才是指针。
    表示*a才是int
    这个是C语言的规则。

     

     

     

     

    展开全文
  • 公文修改符号及其用法

    千次阅读 2018-03-19 08:18:33
    转载自http://www.360doc.com/content/13/0912/13/4353429_313942694.shtml

    转载自http://www.360doc.com/content/13/0912/13/4353429_313942694.shtml

    展开全文
  • C++编译器符号有哪些内容?

    万次阅读 2015-09-10 11:06:35
    C++编译器符号有哪些内容?很早就想写一篇关于符号表的学习小结,可是迟迟不能下笔。其一是因为符号表在编译器的设计中占有举足轻重的地位【我们在学习编译原理的时候更多的是注重principles,而没有关心一个...

    C++编译器符号表有哪些内容?

    很早就想写一篇关于符号表的学习小结,可是迟迟不能下笔。其一是因为符号表在编译器的设计中占有举足轻重的地位【我们在学习编译原理的时候更多的是注重principles,而没有关心一个编译器的实现,所以符号表讲解的也比较少】,编译阶段的每“遍”都会和符号表打交道,本人只做过一个Mini C的编译器的前端部分,感觉功底不够;其二是因为我想在原来C语言的基础上,增加C++语言符号表的一些知识,对于C++的符号表至今为止我还没有在Internet上找到相关的专门描述,有一本书《C++编程艺术》【英文《The Art of C++》,侯先生将其翻译为《实战C++》】中的第九章作者给出一个Mini C++的例子,但是你会发现这个例子被称为Mini C更为合适,为什么这么说?因为在Mini C++中我们不能看到它是怎么处理访问控制符,不能看到多态,不能看到继承,也不能看到虚函数等。啊,这些正是C++区别于C的部分它都没有体现出来,为什么还叫做Mini C++呢?当然如果你不了解任何一个编译器的实现方式这个例子还是值得你去实验一下,如果你没有这本书也找不到这本书的电子版,可以发邮件给我。

    如果文中有任何错误的地方,拜托你一定要指点我,谢谢了!

    符号表存储的内容有哪些?从编译器来看,符号表与编译的各个阶段都有交互,符号表的内容也会在编译器的不同阶段包含不同的内容【一般来讲,在词法分析,语法分析阶段编译器都是填充符号表,在语义分析阶段更多得操作是从符号表中查询数据,当然还有删除符号表的内容】。一般来讲,符号表有内存地址和函数/变量的对应关系,编译时节点的各种属性(类型,作用域,分配空间大小,(函数)的参数类型)等。对符号表的具体使用方法每个编译器都不同。

    目标文件中的符号表用来输出函数/变量符号信息,供连接时给其他模块引用。这种符号表中主要包含函数/变量的名称和地址对应关系,其中的地址一般是位置无关码。

    【在此在推荐一本好书《Linker & Loader》,目前在网上还能找到中科大的一位博士翻译的中文版本,这本书比较详细的介绍了连接器和加载器的工作原理】

    我们可以想象在编译器中符号表的管理使用可以分为三步:收集符号属性、根据BNF范式进行语法的合法性检查、在生成目标代码阶段使用。

    一、 收集符号属性

    编译程序扫描说明部分收集有关标识符的属性,并在符号表中建立符号的相应属性信息。例如,编译程序分析到下述两个说明语句

    int iVar;;
    
    double fArray[2];

    则在符号表中收集到关于符号iVar的属性是一个整型变量,关于符号fArray的属性是具有2个double元素的一维数组。这只是一个简单说明,我们想看一下符号表具体的数据结构。但目前我还没有找到一个非常完整的描述。那么先来看一下Java的Class文件中找到一些类似存储符号表信息的方法。

    借鉴Java的Class文件结构

    下面的ClassFile结构Class文件的C语言描述【以下内容可参考《Java虚拟机规范》第四章或者网上文章《解读Java Class文件格式》】:

    struct ClassFile
    
    {
    
           u4 magic;                                   // 识别Class文件格式,具体值为0xCAFEBABE,
    
           u2 minor_version;// Class文件格式副版本号,
    
           u2 major_version;// Class文件格式主版本号,
    
           u2 constant_pool_count;// 常数表项个数,
    
           cp_info **constant_pool;// 常数表,又称变长符号表,
    
           u2 access_flags; // Class的声明中使用的修饰符掩码,
    
           u2 this_class; // 常数表索引,索引内保存类名或接口名,
    
           u2 super_class;// 常数表索引,索引内保存父类名,
    
           u2 interfaces_count;// 超接口个数,
    
           u2 *interfaces; // 常数表索引,各超接口名称,
    
           u2 fields_count; // 类的域个数,
    
           field_info **fields;// 域数据,包括属性名称索引,域修饰符掩码等,
    
           u2 methods_count;// 方法个数,
    
           method_info **methods;// 方法数据,包括方法名称索引,方法修饰符掩码等,
    
           u2 attributes_count; // 类附加属性个数,
    
           attribute_info **attributes;// 类附加属性数据,包括源文件名等。
    
    };

    其中u2为unsigned short,u4为unsigned long:

    cp_info **constant_pool是常量表的指针数组,指针数组个数为constant_pool_count,结构体cp_info如下:

    struct cp_info
    
    {
    
           u1 tag;           //常数表数据类型
    
           u1 *info;        //常数表数据
    
    };

    常数表数据类型Tag定义如下:

    #define CONSTANT_Class                        7
    
    #define CONSTANT_Fieldref                     9
    
    #define CONSTANT_Methodref                 10
    
    #define CONSTANT_InterfaceMethodref    11
    
    #define CONSTANT_String                       8
    
    #define CONSTANT_Integer                      3
    
    #define CONSTANT_Float                         4
    
    #define CONSTANT_Long                        5
    
    #define CONSTANT_Double               6
    
    #define CONSTANT_NameAndType          12
    
    #define CONSTANT_Utf8                         1

    每种类型对应一个结构体保存该类型数据,例如CONSTANT_Class 的info指针指向的数据类型应为CONSTANT_Class_info

    struct CONSTANT_Class_info
    
    {
    
           u1 tag;
    
           u2 name_index;
    
    };

    CONSTANT_Utf8的info指针指向的数据类型应为CONSTANT_Utf8_info

    struct CONSTANT_Utf8_info
    
    {
    
           u1 tag;
    
           u2 length;
    
           u1 *bytes;
    
    };

    Tag和info的详细说明参考《Java虚拟机规范》第四章4.4节。

    access_flags为类修饰符掩码,域与方法都有各自的修饰符掩码。

    #define ACC_PUBLIC                         0x0001 
    
    #define ACC_PRIVATE               0x0002
    
    #define ACC_PROTECTED                0x0004
    
    #define ACC_STATIC                        0x0008
    
    #define ACC_FINAL                          0x0010
    
    #define ACC_SYNCHRONIZED          0x0020
    
    #define ACC_SUPER                          0x0020
    
    #define ACC_VOLATILE                    0x0040
    
    #define ACC_TRANSIENT                 0x0080 
    
    #define ACC_NATIVE                        0x0100
    
    #define ACC_INTERFACE                  0x0200 
    
    #define ACC_ABSTRACT                   0x0400 
    
    #define ACC_STRICT                        0x0800

    field_info **fields是类域数据的指针数组,指针数组个数为fields_count,结构体field_info定义如下:

    struct field_info
    
    {
    
           u2 access_flags;     //域修饰符掩码
    
           u2 name_index;      //域名在常数表内的索引
    
           u2 descriptor_index;//域的描述符,其值是常数表内的索引
    
           u2 attributes_count;//域的属性个数
    
           attribute_info **attributes; //域的属性数据,即域的值
    
    };

    例如一个域定义如下:

    private final static byte UNSET=127;

    则该域的修饰符掩码值为:ACC_PRIVATE | ACC_STATIC | ACC_FINAL=0x001A。常数表内name_index索引内保存数据为UNSET,常数表内descriptor_index索引内保存的数据为B(B表示byte, 其他类型参考《Java虚拟机规范》第四章4.3.2节)。attributes_count的值为1,其中attributes是指针数组。指针数组个数为attributes_count,在此为1,attribute_info结构体如下:

    struct attribute_info
    
    {
    
           u2 attribute_name_index; //常数表内索引
    
           u4 attribute_length; //属性长度
    
           u1 *info; //根据属性类型不同而值不同
    
    }; 

    attribute_info可以转换(cast)为多种类型ConstantValue_attribute,Exceptions_attribute,LineNumberTable_attribute,LocalVariableTable_attribute,Code_attribute等。

    因为域的属性只有一种:ConstantValue_attribute,因此此结构体转换为

    struct ConstantValue_attribute
    
    {
    
           u2 attribute_name_index;  //常数表内索引
    
           u4 attribute_length;  //属性长度值,永远为2
    
           u2 constantvalue_index; //常数表内索引,保存域的值
    
    //在此例中,常数表内保存的值为127
    
    };

    method_info **methods是方法数据的指针数组,指针数组个数为methods_count,结构体method_info定义如下:

    struct method_info
    
    {
    
           u2 access_flags;   //方法修饰符掩码
    
           u2 name_index;    //方法名在常数表内的索引
    
           u2 descriptor_index; //方法描述符,其值是常数表内的索引
    
           u2 attributes_count;//方法的属性个数
    
           attribute_info **attributes;//方法的属性数据,
    
    //保存方法实现的Bytecode和异常处理
    
    };

    例如一个方法定义如下:

    public static boolean canAccessSystemClipboard()
    
    {
    
           ...
    
    }

    则access_flags的值为 ACC_PUBLIC | ACC_STATIC =0x0009,常数表内name_index索引内保存数据为canAccessSystemClipboard,常数表内descriptor_index索引内保存数据为()Z;(括号表示方法参数,Z表示返回值为布尔型,详细说明参照《Java虚拟机规范》第四章4.3.2节)。attribute_info **attributes是方法的属性指针数组,个数为attributes_count,数组内保存的是常数表索引,info为Code_attribute或Exceptions_attribute。

    ClassFile结构体中的attribute_info **attributes是附加属性数组指针,个数为attributes_count。

    struct SourceFile_attribute
    
    {
    
           u2 attribute_name_index;//常数表内索引
    
           u4 attribute_length;   //属性长度值,永远为2
    
           u2 sourcefile_index;  //常数表内索引,info保存源文件名
    
    };

    C++的符号表的特别之处

    因为Java的Class文件是一个中间文件,在Class文件中保存的信息是很多的,而且和C++编译器也是不完全相同,那么上面的结构中那些是我们在C++编译器生成的符号表中也必须有的?我想上面的field_info、method_info、namespace和const等在C++的符号表也是需要的,但是这些内容也不完全相同。

    那我们先看以下几个常见的问题,加深C++编译器的理解

    « 符号表如何存储静态变量(包括全局变量和局部变量)和类非静态成员变量有哪些区别?

    对于静态变量,C++编译器的处理方法和Java解释器处理的方法有类似的地方。那就是访问控制符public/private/protected和static一样都会写入符号表;对于非静态成员变量符号表存储的什么内容?有没有这些访问控制符?类的非静态成员在类中的表示是通过偏移量来访问,只有和对象邦定以后才能找到其真实的地址,那么在编译后的目标文件中没有为成员分配地址,访问控制符也就没有写入到目标文件。【注1:为什么访问控制符是在编译期间处理,而不放在运行期间处理?如果要放在运行期间处理必须完成新的连接器和加载器来保证,另外重要的是运行效率的问题】【注2:参考CSDN上一篇文章,一个类的成员变量修改了访问控制符,在另外一个文件被引用,是否必须编译修改的文件才能连接成功?《今天面试碰到的一个以前没有想过的问题(顺便给一点分出去)》】。

    « 符号表如何处理const、volatile变量?

    C++编译器把Const对象放在了符号表之中,C语言一般是放在只读数据区。【为什么C++编译器这么做?我想一个原因就是减少一些存储操作次数】。对于volatile变量我们应该怎么考虑?声明的voliate告诉编译器不能优化它呀,我们只能在符号表中增加标识位来告诉编译器自己不优化volatile变量。

    « 符号表怎么处理虚函数、虚继承、多继承的情况?

    其实对于这些处理在Lippman的《Inside the C++ Object Model》中有详细的介绍。也许你知道那些应该放在符号表中,那些是不能的。例如对于局部静态对象static class obj;的定义那些不需要放在符号表中?【注:局部静态变量只要求在函数执行时初始化一次】,为了保证Obj满足要求,需要附加标志变量,这个附加变量能放在符号表中吗?不能,原因很简单,它需要在运行时控制对象的构造和析构。

    一个多继承,有虚函数的例子:

    struct __mptr
    
    {
    
       int delta;  //多继承下第二个对象要调整的偏移量
    
       int index; //是否为虚函数的标志
    
       union {
    
          ptrtofunc  faddr;
    
          int        v_offset;
    
       };
    
    };

    这个数据应该放在哪里?程序的目标代码中还是符号表中?显然这个数据应该放在符号表之中。当然对于C++编译器的不通现实,数据结构可能是不同的,但是我们知道了那些数据应该放在符号表之中啦。

    C++编译器中对于异常是如何完成的?看看《深入探索C++对象模型》,然后再从汇编上分析,在符号表上的处理并没有很大的技巧。但是对于模板的处理,符号表就要起很大的作用啦。目前大多数C++编译器为了减少模板带来的代码扩张基本上都会增加一次编译,准确的获取要实例化的模板对象,可惜的对此内容知之甚少,不敢乱讲。

    也许你觉得我扯了大半天,也没有告诉你一个符号表的准确结构。真的很抱歉,我也没有设计过C++编译器,当然没有办法给出一个完整的结构,我主要是想探索一下怎么设计一个C++编译器使用的符号表。【对于符号表的管理目前常用的是Hash table,可以参考相关文档设计Hash表以及解决冲突的办法】

    二、 根据BNF范式进行语法的合法性检查

    根据文法,可以识别代码。在此处的语法检查主要指的符号表的检查,是编译器出错处理的一部分。例如我们重复定义变量,其根本原因就是变量信息进入符号表时发现已经存在了数据项【当然这个数据项不是上面所说的Hash冲突】。

    是否有符号表的语义检查?从我看来是没有的,语义是什么?语义指的是代码实际代表的意义,符号表仅仅是符号,没有实际的语义。

    三、 在生成目标代码阶段使用

    我想看过编译原理的都经常看到这样的函数lookup(id),指的是在符号表中查找id对象。在生成目标代码的时候就是要根据程序的语义,不断地查找符号表,然后生成目标代码。

    每个符号变量在目标代码生成时需要确定其在存储分配的位置(主要是相对位置)。语言程序中的符号变量由它被定义的存储类别(如在C、FORTRAN语言中)或被定义的位置(如分程序结构的位置)来确定。首先要确定其被分配的区域。例如,在C++中常见的段(sections)有.bss,.data,.text,.rdata,.init,.fini等【可参考《Linker & Loader》或者自己通过反汇编查看,如通过GCC的Objdump -D ExeFile或者Visual Studio中的dumpbin就可以看到可执行文件中所有的段】。其次是根据变量出现的次序,(一般来说)决定该变量在某个区中所处的具体位置,这通常使用在该区域中相对区头的相对位置确定。而有关区域的标志及相对位置都是作为该变量的语义信息被收集在该变量的符号表属性中。

    四、 后记

    如果在以后有时间有机会的话能够阅读的GCC/G++的源代码(不知道未来的N多年中真的是否有这样的机会),我一定重写这篇文章。但是现在,如果你发现我的错误,一定通知我。如果你也有一些涉及到编译器的问题(C and/or C++ Compiler),我也非常乐意和你一起探讨。

    在此恳请指点文中的错误。

    为了使大家能够看到我所参考的文章,我把他们都重新的放在一起,不仅仅是一个连接。希望没有侵犯原作者的版权吆。

    参考的文章:

    【1】 符号表,http://www.cppblog.com/pengkuny/archive/2006/12/18/16581.html

    【2】 Mini Java编译器,http://blog.csdn.net/sandy_xu/category/106115.aspx

    【3】 今天面试碰到的一个以前没有想过的问题(顺便给一点分出去),http://topic.csdn.net/t/20030227/18/1474390.html

    【4】 Const的思考,http://www.openitpower.com/wenzhang/115/12008_1.html

    【5】 解读Java Class文件格式,http://blog.csdn.net/tyrone1979/archive/2006/07/23/964560.aspx

    推荐读物:

    【1】 编译原理。个人手头有好几本,每本都有他的特点。

    【2】 Linker & Loader,网上可以找到中英文版本。

    【3】 深入探索C++对象模型,网上中英文版本都可以找到。

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/abortexit/archive/2007/04/24/1583306.aspx

    展开全文
  • Shell变量基本操作与常用符号详解

    万次阅读 2020-08-12 20:20:56
    shell变量一 shell脚本创建、权限、执行1.1 shell脚本的创建1.2 赋予执行权限1.3 执行脚本二 管道符号与重定向符号2.1 管道操作2.2 重定向操作三 shell变量3.1 变量类型3.2 变量赋值注意点3.2.1 双引号(")3.2.2 单...

    一 shell脚本创建、权限、执行

    1.1 shell脚本的创建

    touch hellloworld.sh
    或vi helloworld.sh

    1.2 赋予执行权限

    chmod +x helloworld.sh

    1.3 执行脚本

    命令注释
    [root@localhost ~]# ./helloworld.sh脚本文件路径(绝对路径与相对路径) ===>需要可执行权限
    [root@localhost ~]# sh helloworld.shsh 脚本文件路径 ===>可以不需要执行权限
    [root@localhost ~]# source helloworld.shsource 脚本文件路径 ===>本身的路径会变化
    [root@localhost ~]# . helloworld.sh通过点号来加载脚本

    二 管道符号与重定向符号

    2.1 管道操作

    管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号"|"左侧的命令输出结果作为右侧命令的输入(处理对象),同一行命令中可以用多个管道。
    cmd 命令 1 | cmd 命令 2 | cmd 命令 n
    例如:
    free -m | grep “Mem” | awk ‘{print $6}’

    2.2 重定向操作

    类型操作符用途
    重定向输入<从指定的文件读取数据,而不是从键盘输入
    重定向输出>将输出结果保存到指定的文件(覆盖原有内容)
    重定向输出>>将输出结果追加到指定的文件尾部
    标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
    标准错误输出2>>将错误信息追加到指定的文件尾部
    混合输出&>将标准输出、标准错误内容保存到指定的文件(覆盖原有内容)
    混合输出&>>将标准输出、标准错误内容追加到指定的文件尾部

    三 shell变量

    3.1 变量类型

    自定义变量:由用户自己定义、修改和使用
    特殊变量:环境变量(USER HOME LANG PATH)、只读变量、位置变量($1,$2,$3……)、预定义变量
    预定义变量:

    变量注释
    $#命令行中位置变量的个数
    $*所有位置变量的内容
    $?上一条命令执行后返回的状态,返回状态值为0表示执行正常,非0值表示异常或出错
    $0当前执行的进程/程序名(即返回当前程序)
    $@对全部的位置参数列表进行分割
    $*把全部位置参数列表看成一个整体

    3.2 变量赋值注意点

    当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号"{}"将变量名称括起来,否则将无法显示正确的变量名称,对于未定义的变量显示为空值。
    在这里插入图片描述

    3.2.1 双引号(")

    主要用来界定字符串,当要赋值的内容中包含空格时必须用双引号括起来,其他情况则可以省略。
    在这里插入图片描述
    在双引号范围内可以使用"$"符号引用其他变量的值。
    在这里插入图片描述

    3.2.2 单引号(’)

    在单引号的范围内,无法引用其他变量的值,所有字符均作为普通字符看待。
    在这里插入图片描述

    3.2.3 反撇号(`)

    反撇号内必须是能够执行的命令行,即把反撇号里面的内容作为命令输入终端,再把输出结果作为一条新的命令输入终端。
    在这里插入图片描述
    图中“expr”表示计算,计算“12+13”的结果,得出“25”,把25作为一条命令输入,结果找不到命令……
    注意:
    反撇号难以多级嵌套,可使用"$()"来代替。
    例如:在这里插入图片描述

    3.2.4 read命令

    read命令用来提示用户输入信息,实现简单的交互过程。执行时从键盘读入一行内容。以空格作为分隔符,把读入的各字段依次赋值给指定的变量。
    在这里插入图片描述
    read命令可以结合"-p"和"-t"选项来设置提示信息与等待时间(默认为秒)
    例如:
    在这里插入图片描述
    再来一次
    在这里插入图片描述

    3.3 变量作用范围

    默认情况下,新定义的变量是局部变量,只在当前环境下有效。当输入命令“bash”进入子shell环境时,局部变量将无法使用。
    在这里插入图片描述
    可以通过命令“export”将指定变量导出为“全局变量”,可以同时操作多个变量,变量名之间以空格分隔。
    在这里插入图片描述

    展开全文
  • Grafana常用定制修改

    千次阅读 热门讨论 2019-10-24 22:54:01
    conf/grafana.ini 设置domain,enforce_domain = true ...修改后清空浏览器缓存避免apple-touch-icon.png和fav32.png的404 设置database,session(remote_cache)统一使用该库(v6.4.0已默认) reporting_...
  • Makefile中常用的一些符号

    千次阅读 2015-07-24 22:43:23
    1 编译器 CC // C语言编译器,默认值为gcc CXX // C++语言编译器,默认值为g++ 说明:这是默认的变量,无需用户自定义(但是用户可以修改其值,例如CC=arm-linux-gcc,用于交叉编译)。
  • Inno setup 常用修改技巧

    千次阅读 2016-08-25 14:29:06
    在 MsgBox 中换行符号为 #13#10 //#13 为回车字符 9、颜色代码 (1)一个值形如 $ bbggrr, 这里的 rr, gg 和 bb 指定了两位的亮度值(以十六进制表示)分别为红色,绿色和蓝色。 (2)预定义的颜色名称: ...
  • 用MarkDown写数学公式时,那些数学符号很容易忘,网上很多好的的博客写这个,但很多都是要么不直观,要么很杂乱没有重点,今天我就来总结一下吧。带目录,可以直接从目录里找自己需要的。后面还有字体和颜色的...
  • 常用的电气制图软件有哪些?以及各自的优缺点 电气画图软件: No.1 "SuperWORKS”(优势:国内软件,容易上手) SuperWORKS是利驰软件历经15年持续不断的升级换代开发的专业电气CAD软件,目前已经产品系列化,包括...
  • Markdown 修改颜色等常用技巧

    千次阅读 2018-10-13 23:27:25
    Markdown 常用技巧: 换行: 方法1: 连续两个以上空格+回车 方法2:使用html语言换行标签:&lt;br&gt; 首行缩进两个字符:(每个表示一个空格,连续使用两个即可) &amp;ensp; 半角的空格 &amp;...
  • 本文提供了一种常用的LaTeX中英文模板,包含数学公式符号图片表格等,注释中已详细说明,可以根据需要自行编辑修改
  • 技术篇-符号制作-标记符号制作

    万次阅读 2015-09-17 16:21:17
    在一个完整的制图过程中,符号制作的成本一般占70%或者更多,是整个制图过程中工作量最大的部分。 如果一开始具有制作所需的符号库,那么,制图工作就会变得轻松得多。符号的制作一般遵循以下几方面: - 符号...
  • 2.1、转义特殊符号方式 2.2、使用 CDATA 区段 3、Mybatis if 判断等于一个字符串 4、mysql二进制转成字符串 1. 使用场景 因为我们在日常代码Mybatis 动态拼接语句时候经常使用到 大于(>,>=)、小于(<,...
  • 修改指南的每个修改条目尽量以多个关键词作为条目标题,你可以使用简短的关键词进行文本搜索,比如“候选”、“F4”、“顶屏”、“快捷键”等,即可快速定位到要修改的具体方法内容。可多次搜索以找到尽可能全面...
  • LaTeX 各种命令,符号

    万次阅读 多人点赞 2016-06-12 15:27:42
    函数、符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} latex数学符号表(2)" style="border:none; max-width:100%"> \acute{\eta} latex数学符号表(2)" style="border:none; max...
  • title('论文中常用的标准3点式显示') x=20:10:20000; y=rand(size(x)); subplot(3,2,6) semilogx(x,y); set(gca,'XLim',[20 20000]); set(gca,'XMinorTick','off'); set(gca,'...
  • Linux 常用命令 — 修改密码

    万次阅读 2007-12-14 09:29:00
    passwd命令 出于系统安全考虑,Linux系统中的每一个用户除了其用户名外,还有其对应的用户口令。因此使用useradd命令增加时,还需使用passwd命令为每一位新增加的用户设置口令;用户以后还可以随时用passwd命令...
  • Go 在 MongoDB 中常用查询与修改

    千次阅读 2018-06-10 13:14:37
    注意修改单个或多个字段需要通过$set操作符号,否则集合会被替换。 2.1、($set) //修改字段的值 c .Update ( bson .M { "_id" : bson .ObjectIdHex ( "5204af979955496907000001" )}, bson .M { "$set" ...
  • 程序员常用字体(vs字体修改方案)

    千次阅读 2016-10-11 16:28:36
    字体不仅是设计师手中重要的武器,对我们开发人员来说,字体的选择也许多讲究,一个好的、适合展示代码的字体,应该具备以下要素: 等宽的字符简洁、清晰并且规范的字符形状支持ASCII码为128以上的扩展字符集与...
  • Linux常用命令

    千次阅读 2019-03-11 23:52:27
      本文介绍的是Linux中的常用命令用以满足日常的操作,但并非所有命令。更详细的命令烦请参考手册 http://man.linuxde.net/ Linux常用命令 1.修改基本配置 1.1修改主机名 vi /etc/sysconfig/network 1.2...
  • 1 VBA和EXCEL使用符号常数语法差别 1.1 语法差别 比如EXCEL里使用char(10) VBA中只能写成 chr(10) VBA的语法错误,VBE没有把第1个首字母大写就应该看出来 char(13) 是错误的 1.2 举例: chr(32) 类空格 ...
  • Protel零件库中常用器件封装电阻 AXIAL 无极性电容 RAD 电解电容 RB电位器 VR二极管 DIODE三极管 TO场效应管 和三极管一样电源稳压块78和79系列 TO-126H和TO-126V 整流桥 D-44 D-37 D-46 单排多...
  • 11. 符号符号解析

    千次阅读 多人点赞 2018-12-04 21:35:00
    每个可重定位目标模块m都一个符号表,它包含了在m中定义和引用的符号,三种链接器符号: 类型 特征 举例 Global symbols(模块内部定义的全局符号) 由模块m定义并能被其他模块引用的符号。例如,非...
  • C语言 —— 符号(C语言的基本符号

    万次阅读 多人点赞 2019-01-09 09:10:33
    C 语言的基本符号 20 多个,每个符号可能同时具有多重含义,而且这些符号之间 相互组合又使得 C 语言中的符号变得更加复杂起来。 符号 名称 符号 名称 , 逗号 &gt; 右尖括号 . ...
  • Xshell :一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET ...在xshell终端下常用的命令: @[TOC] 目录 ## 第一部分 0.帮助命令与清屏 help 查看帮助命令 ls --help ...
  • 文本符号用于绘制地图上的标注、注记、标题、动态文本、描述、注释、图例、比例尺、经纬网标注、表以及其他文本信息...文本符号与其他类型的常用符号(标记、线和填充符号)的关键区别在于,文本符号只能具有一个图层。
  • ArcGIS符号制作快速入门

    千次阅读 2015-04-13 13:55:05
    ArcMap中最常用符号有点符号(Marker Symbol)、线符号(Line Symbol)、面符号(Fill Symbol)、文本符号(Text Symbol)。在Style manager中创建新的符号库文件,或打开已经存在的符号库,然后分别选择点、线、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 263,555
精华内容 105,422
关键字:

常用的修改符号有哪些