FB混合C语言编译

2023-12-26 22:20
文章标签 语言 编译 混合 fb

本文主要是介绍FB混合C语言编译,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是群友分享的方法,这里只是作为记录和分享。

有了这个功能,可以很方便的拷贝一下C或者C++代码直接用到FB上。

既然是混合C语言编译,当然得有C的代码。比如随便去网上找两个排序:冒泡排序和选择排序,代码如下:

1、冒泡排序:(存储为BubbleSort.c)

void BubbleSort(int arr[],int size)
{int j,i,tem;for (i = 0; i < size-1;i ++)//size-1是因为不用与自己比较,所以比的数就少一个{int count = 0;for (j = 0; j < size-1 - i; j++)	//size-1-i是因为每一趟就会少一个数比较{if (arr[j] > arr[j+1])//这是升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置{tem = arr[j];arr[j] = arr[j+1];arr[j+1] = tem;count = 1;}}if (count == 0)			//如果某一趟没有交换位置,则说明已经排好序,直接退出循环break;	}
}

2、选择排序:(存储为SelectSort.c)

void SelectSort(int arr[],int size)
{int i = 0;for (i = 0; i < size-1; i++){int min = i;int j = 0;for (j = i+1; j < size; j++){if (arr[j] < arr[min]){min = j;}}//交换两个数if(i != min){int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}
}

3、包含全局变量和头文件引用的C程序(存储为Testfunc.c)

#include <stdio.h>int GlobalVar = 666666;		//全局变量
int PrintVar = 0;void Testfunc(void)			//测试函数
{printf("the global variable is:%d",PrintVar);	//调用printf函数
}

然后就是设置编译方式和声明函数了。

1、需要设置GCC编译器,如果使用GAS编译是不行的。(32位的FB默认使用GAS编译)

如果是使用VFB来编译程序,则需要在内核模块的程序起始块里来设置,这里设置的代码会放到所有代码的最前部,这是我们需要的。用#cmdline来声明命令(主要是比较方便,也可以在IDE里的工程属性里的附加编译选项里设置。)-gen gcc就是指定编译器为GCC编译。

#cmdline "-gen gcc"                    '设置编译器为GCC编译 

2、需要包含前面的C代码文件。需要用-Wc命令来将我们需要的命令传递给GCC编译器,命令间用逗号“,”分隔。用-include 指定你需要包含的C文件,后面是文件名(我是放在编译路径下,VFB的release文件下),这里有BubbleSort.c和SelectSort.c。

#cmdline "-Wc -include,BubbleSort.c"   '包含BubbleSort.c文件给GCC编译
#cmdline "-Wc -include,SelectSort.c"   '包含SelectSort.c文件给GCC编译

3、如果C文件里有使用头文件(或者其他引用的文件),则需要声明头文件的路径,否则会编译失败。我直接拷贝了DevC++目录下的头文件(文件名include)到release里,这样方便寻找。声明如下:

#cmdline "-Wc -include,Testfunc.c,-I..\release\include"            '指定头文件搜索目录

4、FB里对C全局变量声明方式:

全局变量需要用【Extern 变量名 Alias "C里的变量名" as 数据类型】来声明,变量名可以与C的变量名不一样,也可以一样。例如:C里的GlobalVar改成gvar完全没问题。

Extern gvar Alias "GlobalVar" As Long
Extern PrintVar Alias "PrintVar" As Long

5、FB里的C函数的声明:

5.1、使用Extern "C" ... End Extern块来声明函数,同时在其中使用Declare关键字来声明函数。

5.2、一般来说,C里的返回值是void的,FB里使用sub,不是void的,使用function。

5.3、C里的数组在FB里需要声明指针,不能使用FB的数组直接声明(FB的数组是一个类型结构,与C的数组有区别。)

5.4、如果不需要修改函数名,可以直接对应C函数转换。如果需要修改函数名,则需要用Alias来声明(规则与全局变量一样)。代码如下:

Extern "C"
'//冒泡排序
'//C定义 void BubbleSort(int arr[],int size)
Declare Sub BubbleSort(arr As Long Ptr,ByVal nsize As Long)  'c的数组得用指针,不能用FB的数组直接传过去
'//选择排序
'//C定义 void SelectSort(int arr[],int size)
Declare Sub SelectSort(arr As Long Ptr, ByVal nsize As Long) 'c的数组得用指针,不能用FB的数组直接传过去
'--------------------------------------------------------------------
'C定义 void Testfunc(void)
Declare Sub PrintGlobalVar Alias "Testfunc"()                'C里的函数名为Testfunc,如果有需要(比如有冲突)换一个名字,可以用AliasEnd Extern

使用时与FB函数和变量一样,具体例子如下:

FB与C混合编译

这篇关于FB混合C语言编译的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/540983

相关文章

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超