Skip to content

2. 变量与类型

2.1 基本类型

TransPyC 支持 Python 内置类型和 t 模块的扩展 C 类型。

2.1.1 内置类型

a: int = 42                  # int
b: float = 3.14              # float
c: str = "hello"             # char*
d: bool = True               # bool

生成 C:

int a = 42;
float b = 3.14;
char* c = "hello";
bool d = 1;

2.1.2 t 模块类型

import t

x: t.CChar = 'A'             # char
y: t.CShort = 100            # short
z: t.CLong = 1000000L        # long
f: t.CFloat = 3.14f          # float
d: t.CDouble = 3.14159265    # double

生成 C:

char x = 'A';
short y = 100;
long z = 1000000L;
float f = 3.14f;
double d = 3.14159265;

2.1.3 带初始化

count: int = 0
name: str = "TransPyC"
pi: float = 3.14159

2.1.4 仅声明(不初始化)

在初始化表达式中写 c.State 表示"仅声明,不赋初值":

import c

x: int = c.State              # int x;
ptr: str = c.State            # char* ptr;

生成 C:

int x;
char* ptr;

翻译器识别 = c.State 后省略 = 值 部分,只生成声明语句。

2.2 存储修饰符

2.2.1 static

import t

counter: t.CStatic | int = 0      # static int

生成 C:

static int counter = 0;

2.2.2 extern

import t

external_var: t.CExtern | int     # extern int

2.2.3 const / volatile

import t

MAX: t.CConst | int = 100         # const int
flag: t.CVolatile | int = 0       # volatile int

2.3 指针类型

import t

# 整数指针
p: t.CPtr | int                    # int*
buf: t.CPtr | t.CChar              # char*

# 结构体指针
task: t.CPtr | t.CStruct(name="TASK")  # struct TASK*

生成 C:

int* p;
char* buf;
struct TASK* task;

2.4 数组类型

2.4.1 一维数组

import t

arr: t.CChar[16]                   # char[16]
nums: int = [1, 2, 3, 4]           # int nums[] = {1, 2, 3, 4}

生成 C:

char arr[16];
int nums[] = { 1, 2, 3, 4 };

2.4.2 数组访问

arr[0] = 10
x = arr[i]

生成 C:

arr[0] = 10;
x = arr[i];

2.5 类型转换

2.5.1 c.TypeCast

import c

x: int = 42
y = c.TypeCast('float', x)         # ((float)x)

生成 C:

int x = 42;
int y = ((float)x);

2.5.2 t 模块类型转换

import t

val = t.CInt(some_expr)            # ((int)some_expr)
ptr = t.CType(addr, MY_STRUCT, t.CPtr)  # ((struct MY_STRUCT *)addr)

2.6 sizeof

# 数组长度
arr: int = [1, 2, 3]
n = len(arr)                    # sizeof(arr) / sizeof(arr[0])
size = sizeof(int)              # sizeof(int)

2.7 类型组合规则

| 运算符按以下优先级合并 C 类型名:

优先级 规则 示例
1 存储修饰符优先 static \| intstatic int
2 指针置后 int \| *int*
3 类型合并 long \| intlong int
4 struct 优先 struct \| *struct *
import t

# static int
counter: t.CStatic | int

# struct TASK*
task: t.CPtr | t.CStruct(name="TASK")

# const char*
msg: t.CConst | t.CPtr | t.CChar