level 1
暂且只介绍Windows和Linux平台。
首先要使用系统自带的外部库。若编译平台是Windows,则C运行库名称为 'msvcrt' ,若平台为 Linux,则库名称为 'libc' 。
Windows和Linux的平台区别主要是Windows的换行字符串为
#13#
10("\r\n"),Linux的为#10("\n")。但不用在意这点,Windows下的输出函数在检测到输出文件为文本文件时,会自动补上 \r 。
还有一点就是微软的运行库比较旧,不支持 %zu 输出 size_t 。有些 OJ 的运行库停留在上个世纪,不支持 %lld (尽管支持 %I64d 但毕竟不是规范),建议不要使用。
使用 C 运行库时尽量不要用 Extended 类型,容易出现问题。有些运行库不支持 80bit 浮点数,另外就算是支持的库也可能存在压栈问题。
2016年08月21日 07点08分
1
level 1
对应类型
(左 C 右 Pascal)
signed char : ShortInt
unsigned char : Byte
short : SmallInt
unsigned short : Word
int : LongInt (32/64位)
unsigned int : LongWord (32/64位)
long : LongInt (32位)/ Int64 (64位)
unsigned long : LongWord (32位) / QWord (64位)
long long : Int64
unsigned long long : QWord
char : Char
char* : PChar
2016年08月21日 07点08分
2
level 1
float : Single
double : Double
void* : Pointer
size_t : SizeUInt
2016年08月21日 07点08分
3
level 1
注意 C 运行库函数都是采用 C 声明调用约定(cdecl,C 中写作 __cdecl)的。所以要用调用修饰。像 printf 这种可变参数函数还要用 varargs 声明。
另外声明外函数时,若未指定本名,则大小写是有别的,需要注意。
以下是 printf 的外部声明方法:
function printf(fmt:PChar):LongInt;varargs;cdecl;
external 'libc';
在Pascal调用时函数名可以不用在意大小写,但声明时必须完全符合全小写的 printf 。
2016年08月21日 07点08分
4
level 1
有时因为外部函数名称与Pascal关键词或函数重合,需要给它换个别名,方法是用 name 修饰符后加本名:
function AliasPrintf(fmt:PChar):LongInt;varargs;cdecl;
external 'libc' name 'printf';
另外,若 C 函数返回值为 void ,则应将其声明为过程。
2016年08月21日 07点08分
5
level 1
除了部分内部视作固定表达式的函数(如 abs, ln, ord 等)外,Pascal的函数也可以用过程的语法,舍弃返回值。
Pascal 的字符串字面常量能被自动转换成 PChar 指向的 C 风格字符串。但要注意转义字符的写法不同。
var
i:LongInt=10;
begin
printf('Hello World'
#10'%d'#
10, i);
end.
声明了 printf 后如上代码合法,且输出
Hello World
10
上面的格式字符串在 C 中的写法是 "Hello World\n%d\n" 。
2016年08月21日 07点08分
6
level 1
突然想起来 scanf 还没提。
其实差不多,注意Pascal的取址运算符是 @ 。
声明
function scanf(fmt:PChar):LongInt;varargs;cdecl;
external 'libc';
调用
var
c:Char;n:Int64;x:Single;y:Double;
begin
scanf('%c%lld%f%lf', @c, @n, @x, @y);
//...
end.
2016年08月22日 09点08分
10
level 1
由于不同平台下 stdin, stdout 定义不同,所以输入输出文件还是用 fscanf/fprintf 比较方便。
不同平台下 C 的 FILE 类型也有区别,不过不要紧,我们只需要指向它的指针。
可以这么声明:
type
CFilePtr=Pointer;
funtion fopen(fname, fmode:PChar):CFilePtr;cdecl;
external 'libc';
function fclose(fptr:CFilePtr):LongInt;cdecl;
external 'libc';
function fprintf(fin:CFilePtr;fmt:PChar):LongInt;varargs;cdecl;
external 'libc';
调用:
var
fout:CFilePtr;
begin
fout:=fopen('title.out', 'w');
fprintf(fout, 'FILE TEXT OUT'#10);
fclose(fout);
end.
2016年08月22日 09点08分
11