可变目标C编译器 第4章 类型
C程序中具有丰富的数据类型,包括声明中显式定义的类型和用做表达式中间类型的导出类型。例如,下面的赋值语句包含3 种不同类型:
int *p, x;
*p = x;
x是一个存放整数的单元的地址,因此x的地址的类型是:指向一个整数的指针。x的值的类型是整型。同样, p的左值的类型是指向一个整数的指针的指针,p的右值的类型是指向一个整数的指针,*p的类型是整数。lcc在编译赋值语句时必须处理所有这些类型。
lcc实现了类型表示和一组该表示之上的函数,本章将对此进行介绍。函数包括创建类型的类型构造函数以及测试类型 的类型断言函数。lcc还必须实现类型检查,确保声明和表达式遵守语言制定的规则。类型检查使用本章介绍的断言函数,详细参见第9章和第11章。
4.1 类型表示
C语言的类型通常用英文的前缀形式描绘,所谓前缀形式,就是指类型操作数在类型操作符之后出现。例如,int *p声明p是一个指向int的指针,就是C类型int*的前缀表示,指针是操作符,int是操作数,同样,char*(*strings)[10]将strings说明为:
一个指针,指向
一个大小为10的数组,每个数组元素是一个
指针,指向
字符
操作数在它们各自的操作符下以阶梯方式缩进。
表示这种前缀类型规范的方法有很多。例如,一些老的C编译器使用位串来表示,类型操作符和基本类型用若干位编码。位串表示非常紧凑并易于操作,但是一般会对基本和操作符的数目做一定限制,并且不能拥有表示大小的数据,例如不能表示数组的大小。
lcc 通过能反映类型的前缀规范的链接结构来表示类型,类型节点定义如下:
(types.c typedefs) =
typedef struct type * Type;
(types.c exported types) =
struct type {
int op;
Type type;
int align;
int size;
&
相关文档:
今天为了给顶嵌杯做准备又回到linux下开始c编程了。刚开始是练习写一个与矩阵变换有关的程序,为了节省时间有一个函数模块是直接用的以前在windows下编程时所使用的。结果在linux下编译完运行之后很快就崩溃了,由于调试水平不高弄了很久也不知到问题出在哪里。正在百思不得其解时忽然注意到(当然不是自己调试出来的 ......
今天要编个最简单的"hello world"的C程序,算是初步感受下Linux中的编程环境,涉及以下3个步骤:
1. 先在"vim"里编写源文件;
2. 然后再用"gcc"编译生成"hello"的可执行文件;
3. 运行"hello",看看效果。
那么开始吧!
1. vim
vim hello.c
i
#include <stdio.h>
int
main (void)
{
printf ("hello.\n" ......
第一章 概念
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。
先声明几个指针放着做例子:
例一:
(1)int *ptr;
(2)char ......
extern "C" 详解
在C++中,为了支持重载机制,在编译生成汇编代码时,函数的名字要加入函数的参数类型或者返回值类型等信息
在C中,因没有重载机制,编译后的代码只是简单的函数名字而已,不加入其他的信息
1. 不加入extern "C"
testexternc.cpp
int mytest(void)
{
int a=10,b=20;
int c=a+b;
ret ......
Data Type Ranges
C/C++ recognizes the types shown in the table below.
Type Name Bytes Other Names Range of Values
&nb ......