# tcc 库模块帮助文档

## tcc 成员列表 <a id="tcc" href="#tcc">&#x23;</a>

TinyCC 扩展库（ 编译器版本 0.9.27 ）  
此扩展库体积很小，支持发布后生成独立 EXE，  
TinyCC 文档： http://bellard.org/tcc/tcc-doc.html   
完整头文件下载: http://download.savannah.gnu.org/releases/tinycc/winapi-full-for-0.9.27.zip

### tcc() <a id="tcc()" href="#tcc()">&#x23;</a>
创建TCC C语言编译器,  

[返回对象:tccObject](#tccObject)

### tcc._includedir <a id="tcc._includedir" href="#tcc._includedir">&#x23;</a>
默认头文件目录

### tcc._libdir <a id="tcc._libdir" href="#tcc._libdir">&#x23;</a>
默认库目录

### tcc._rootdir <a id="tcc._rootdir" href="#tcc._rootdir">&#x23;</a>
TCC根目录,需要的DLL组件目录;

### tcc.build <a id="tcc.build" href="#tcc.build">&#x23;</a>
直接编译 C代码为执行文件

### tcc.build() <a id="tcc.build" href="#tcc.build">&#x23;</a>
[返回对象:tccBuilderObject](#tccBuilderObject)

### tcc.build(path,code,...) <a id="tcc.build" href="#tcc.build">&#x23;</a>
直接编译 C代码为执行文件,  
必须使用 @path 指定输出的执行文件路径,  
可选用 @code 参数指定 C语言 源代码,  
如果没有指定 @code 参数，会返回一个对象,  
对返回对象的 code 属性赋值则会自动生成 DLL 文件,  
可选增加一个或多个参数指定要添加的库文件

## tccObject 成员列表 <a id="tccObject" href="#tccObject">&#x23;</a>

### tccObject.* <a id="tccObject.any" href="#tccObject.any">&#x23;</a>
直接获取 C函数,  
相当于调用 getCdecl 且不指定参数原型,  
这种方法获取 C函数 同样会导致自动调用 relocate 函数,  
返回函数对象的调用规则与不声明调用API相同  

一、传入参数规则：  
1、null参数不可省略  
2、32位整数类型，小于32位的整数、以及枚举类型都可以直接在API参数中写数值。  
3、对于任何数值类型的指针（输出参数）一律使用结构体表示，例如double * v 表示为{ double v }  
4、数组使用结构体表示  
5、所有结构体传给API的都是指针地址，都是输出参数并增加返回值  

返回值默认为int类型  
不支持使用 API 尾标改变返回值类型

### tccObject.addFile() <a id="tccObject.addFile" href="#tccObject.addFile">&#x23;</a>
[返回对象:tccObject](#tccObject)

### tccObject.addFile(path,...) <a id="tccObject.addFile" href="#tccObject.addFile">&#x23;</a>
添加 *.c 源码文件或 *.o, *.obj 文件  

此函数返回 tcc 对象自身

### tccObject.addIncludePath("字符串参数") <a id="tccObject.addIncludePath" href="#tccObject.addIncludePath">&#x23;</a>
添加头文件目录

### tccObject.addLib() <a id="tccObject.addLib" href="#tccObject.addLib">&#x23;</a>
[返回对象:tccObject](#tccObject)

### tccObject.addLib(库文件) <a id="tccObject.addLib" href="#tccObject.addLib">&#x23;</a>

```aardio
tccObject.addLib(  
 	"user32",  
	"kernel32",  
	"gdi32" /*这几个库默认已添加,这里仅作演示  
静态库必须在"\lib\tcc\.res"目录下可找到 lib库名.a 文件  
动态库必须在"\lib\tcc\.res"目录下可找到 库名.def 文件,请到tcc官网下载def生成工具  
请到tcc官网下载def生成工具  
*/  
)
```

### tccObject.addLibPath("字符串参数") <a id="tccObject.addLibPath" href="#tccObject.addLibPath">&#x23;</a>
添加库目录

### tccObject.addSysIncludePath("字符串参数") <a id="tccObject.addSysIncludePath" href="#tccObject.addSysIncludePath">&#x23;</a>
添加系统头文件目录

### tccObject.close() <a id="tccObject.close" href="#tccObject.close">&#x23;</a>
关闭C语言解释器

### tccObject.code <a id="tccObject.code" href="#tccObject.code">&#x23;</a>

```aardio
tccObject.code = /***   
	#include <stdlib.h>   
	#include <windows.h>  

	/*  
	DLL入口函数,该函数可以有也可以没有。  
	总之在DllMain最好不要调用API函数.  
	*/  
	int stdcall DllMain(void * hinstDLL, unsigned long fdwReason, void * lpvReserved) {  
		if (fdwReason == 1/*DLL_PROCESS_ATTACH*/ ){   

		}  
		return 1;  
	}  

	//导出变量	  
declspec(dllexport) const wchar_t *hello_data = L"(UTF8字面量定义为UTF16字符串)";  

	//DLL导出函数  
declspec(dllexport) void helloW (const wchar_t * msg)  
	{  
		MessageBoxW (0, msg, hello_data, MB_ICONINFORMATION);/*DLL导出函数*/  
	}  
***/
```

### tccObject.compile(C源码) <a id="tccObject.compile" href="#tccObject.compile">&#x23;</a>
编译C源码,  
注意只有源码为UTF8编码,才能支持 L"UTF-16字面量" 的C语法  
出错则触发onError事件,如果未指定该事件则抛出异常

### tccObject.define("NDEBUG预处理器符号","1") <a id="tccObject.define" href="#tccObject.define">&#x23;</a>
定义预处理器符号,如果值为 null 则删除该定义.  
预处理器符号需要在添加或编译 C 源码前定义才会有效,  
如果定义 NDEBUG 为 1，则不编译 assert 函数并可输出较小文件  
此函数返回 tcc 对象自身

### tccObject.define() <a id="tccObject.define" href="#tccObject.define">&#x23;</a>
[返回对象:tccObject](#tccObject)

### tccObject.enableIoPrintf <a id="tccObject.enableIoPrintf" href="#tccObject.enableIoPrintf">&#x23;</a>
在C 代码中添加 io_printf

### tccObject.enableIoPrintf(bufferSize) <a id="tccObject.enableIoPrintf" href="#tccObject.enableIoPrintf">&#x23;</a>
在C 代码中添加 io_printf,  
可选用 @bufferSize 指定最大可输出的字节数,默认为512字节,  
io_printf 与C函数 printf 的用法相同,  
但 io_printf 会调用 aardio 的 io.print 函数输出字符串,  
io_printf 可更好地兼容 aardio 控制台以及 UTF-8 编码,  
注意只有通过 tcc 扩展库直接执行 C代码才能使用此函数

### tccObject.getCdecl("字符串参数","void()") <a id="tccObject.getCdecl("字符串参数","void" href="#tccObject.getCdecl("字符串参数","void">&#x23;</a>
获取编译后的C函数  
可选用参数@2 指定函数原型,语法与声明API相同  
如果不指定函数原型,用法与不声明直接调用 API 相同,  
如果从未调用过 relocate 则自动调用.

### tccObject.getSymbol("符号名") <a id="tccObject.getSymbol" href="#tccObject.getSymbol">&#x23;</a>
可使用此函数获取函数地址

### tccObject.output <a id="tccObject.output" href="#tccObject.output">&#x23;</a>
输出文件

### tccObject.output(path,code) <a id="tccObject.output" href="#tccObject.output">&#x23;</a>
输出文件,  
@path 参数指定 *.o, *.obj, *.dll 或 *.exe 等输出文件路径,  
@code 为可选参数,用于指定C源代码,建议用 UTF-8 编码

### tccObject.relocate() <a id="tccObject.relocate" href="#tccObject.relocate">&#x23;</a>
重定位  
此函数在调用getCdecl()前被自动调用.

### tccObject.run() <a id="tccObject.run" href="#tccObject.run">&#x23;</a>
编译并执行int main() 入口函数.  
可添加任意多个字符串参数

### tccObject.setCdecl(函数,函数名,原型) <a id="tccObject.setCdecl" href="#tccObject.setCdecl">&#x23;</a>

```aardio
tccObject.setCdecl(  
	function(){  

	},  
	"函数名",  
	"void()"  
)
```

### tccObject.setCdecl(函数指针,函数名) <a id="tccObject.setCdecl" href="#tccObject.setCdecl">&#x23;</a>
直接将C函数指针传入tcc

### tccObject.setOptions("-Wall") <a id="tccObject.setOptions" href="#tccObject.setOptions">&#x23;</a>
启用所有警告

### tccObject.setOptions("-bt N") <a id="tccObject.setOptions" href="#tccObject.setOptions">&#x23;</a>
允许调试,生成的文件较大

### tccObject.setSymbol("符号名",指针) <a id="tccObject.setSymbol" href="#tccObject.setSymbol">&#x23;</a>
可使用此函数添加函数指针

## tccObject 事件列表 <a id="tccObjectEvent" href="#tccObjectEvent">&#x23;</a>

### tccObject.onError <a id="tccObject.onError" href="#tccObject.onError">&#x23;</a>

```aardio
tccObject.onError = function(msg){
	console.log( msg ) /*编译警告或错误会触发此事件  
如果不定义此事件,aardio默认弹出对话框或使用控制台显示此信息*/
}
```

## tccBuilderObject 成员列表 <a id="tccBuilderObject" href="#tccBuilderObject">&#x23;</a>

### tccBuilderObject.code <a id="tccBuilderObject.code" href="#tccBuilderObject.code">&#x23;</a>

```aardio
tccBuilderObject.code = /***  
#include <windows.h>   
declspec(dllexport) int Add( int a,int b )   
{       
	return a + b;/*如果调用 tcc.build 时没有指定 C代码 就可以在这里指定 C代码。 */  
}   
***/
```

### 自动完成常量
_TCC_OUTPUT_DLL=3  
_TCC_OUTPUT_EXE=2  
_TCC_OUTPUT_MEMORY=1  
_TCC_OUTPUT_OBJ=4  
_TCC_OUTPUT_PREPROCESS=5  
