精华内容
下载资源
问答
  • C++调用C代码一个C语言文件p.c#include void print(int a,int b){printf("这里调用的是C语言的函数:%d,%d\n",a,b);}一个头文件p.h#ifndef _P_H#define _P_Hvoid print(int a,int b);#endifC++文件调用C函数#include ...

    C++调用C代码

    一个C语言文件p.c

    #include

    void print(int a,int b)

    {

    printf("这里调用的是C语言的函数:%d,%d\n",a,b);

    }

    一个头文件p.h

    #ifndef _P_H

    #define _P_H

    void print(int a,int b);

    #endif

    C++文件调用C函数

    #include

    using namespace std;

    #include "p.h"

    int main()

    {

    cout<

    print(3,4);

    return 0;

    }

    执行命令

    gcc -c p.c

    g++ -o main main.cpp p.o

    编译后链接出错:main.cpp对print(int, int)未定义的引用。

    原因分析

    p.c我们使用的是C语言的编译器gcc进行编译的,其中的函数print 编译之后,在符号表中的名字为 _print

    我们链接的时候采用的是g++进行链接,也就是C++链接方式,程序在运行到调用 print函数的代码时,会在符号表中寻找_print_int_int(是按照C ++的链接方法来寻找的,所以是找_print_int_int而不是找_print )的名字,发现找不到,所以会t提示“未定义的引用”

    此时如果我们在对print的声明中加入 extern “C” ,这个时候,g ++编译器就会按照C语言的链接方式进行寻找,也就是在符号表中寻找_print ,这个时候是可以找到的,是不会报错的。

    总结

    编译后底层解析的符号不同,C语言是_print,C++是_print_int_int

    解决调用失败问题

    修改p.h文件

    #ifndef _P_H

    #define _P_H

    extern "C"{

    void print(int a,int b);

    }

    #endif

    修改后再次执行命令

    gcc -c p.c

    g++ -o main main.cpp p.o

    ./main

    运行无报错

    思考:那C代码能够被C程序调用吗

    实验:定义main,c函数如下

    #include

    #include "p.h"

    int main()

    {

    printf("现在调用C语言函数\n");

    print(3,4);

    return 0;

    }

    重新执行命令如下

    gcc -c p.c

    gcc -o mian main.c p.o

    报错:C语言里面没有extern “C“这种写法

    C代码既能被C++调用又能被C调用

    为了使得p.c代码既能被C++调用又能被C调用

    将p.h修改如下

    #ifndef _P_H

    #define _P_H

    #ifdef __cplusplus

    #if __cplusplus

    extern "C"{

    #endif

    #endif /* __cplusplus */

    void print(int a,int b);

    #ifdef __cplusplus

    #if __cplusplus

    }

    #endif

    #endif /* __cplusplus */

    #endif /* __P_H */

    再次执行命令

    gcc -c p.c

    gcc -o mian main.c p.o

    ./mian

    结果示意:

    c90bb9557ffd6f15a19eabcec299ba92.png

    到此这篇关于C++调用C接口的实现示例的文章就介绍到这了,更多相关C++调用C接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • c调用汇编实例 学习单片机c语言调用汇编 c调用汇编实例 学习单片机c语言调用汇编 c调用汇编实例 学习单片机c语言调用汇编 c调用汇编实例 学习单片机c语言调用汇编 ..................
  • 华为c语言编程规范是怎样的2011 版本 附件传给你了。...WIN32 Api都采用_stdcall调用方式 _cdecl是C/C++的缺省调用方式,参数采用从右到左的压栈方式。调用函数时规范的编程是吧主函数main写在前面呢还是把调用函...

    华为c语言编程规范是怎样的

    2011 版本 附件传给你了。

    调用规范stdcall和c语言的区别

    878785cf76ac4ecdb93cc9d43b2b7586.png

    在函数参数处理上不同 _stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈。WIN32 Api都采用_stdcall调用方式 _cdecl是C/C++的缺省调用方式,参数采用从右到左的压栈方式。

    调用函数时规范的编程是吧主函数main写在前面呢还是把调用函数写在前面??

    实用的C语言编程规范 简介: 在项目团队协作开发的情况下,编程时应该强调的一个重要方面是程序的易读性,在保证软件速度等性能指标能满足用户需CSS布局HTML小编今天和大家分享的情况下,能让其他程序员容易读懂你所编写的程序。若项目小组的所有开发人员都遵循统一的、鲜明

    简洁紧凑、灵活方便 C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计

    一,C语言的特点1,语言简洁,紧凑,使用方便,灵活2,运算符丰富3,数据类型丰富,具有现代语言的各种数据结构4,具有结构化的控制语句5,语法限制不太严格,程序设计自由度大6,C语言允许直接访问物理地址,能进行位(bit)操作。

    linux 下c编程.linux系统调用和c标准函数有什么区标准的c函数库是所有的编译都要具有的函数库,(实际上还是略有不同),但是这些基本上实现方法略有不同,但是结果和标准是一样的。但是linux的系统调用,调用是linux的系统库,比如说unistd.h下的fork这个是Linux下特有,你在vs上。

    c,c++的编程规范如此晦涩,怎么还有那么多人遵从?

    在学校和工作初期一直在搞java和c#, 最近换工作开始搞c, c++. 这开始阶C语言发展如此迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。许多著名的系统软件,如DBASE Ⅳ都是由C 语言编写的。用C 语言加上一些汇编语言子程序,就更能显示C 语言的优势了,像PC- DOS 、WORDSTAR等就是用这种方法编写的。

    展开全文
  • c语言调用c语言的so动态库

    千次阅读 2017-02-07 15:17:05
    1.环境  ubuntu14.o4 gcc 4.8.4 2.库文件生成 1)源码 //clTest.c ...int add(int a, int b) { ...cd到clTest.c所在目录,...gcc -shared -o libclTest.so clTest.c会在当前目录生成文件libclTest.so 3.主程序 1)

    1.环境 

    ubuntu14.o4  

    gcc 4.8.4

    2.库文件生成

    1)源码

    //clTest.c
    
    int add(int a, int b) {
    	return a + b;
    }
    2)生成库文件

    cd到clTest.c所在目录,输入命令

    gcc -shared -o libclTest.so clTest.c
    会在当前目录生成文件libclTest.so

    3.主程序

    1)源码

    //cclTest.c
    #include <stdio.h>
    #include <dlfcn.h>
    
    int main(void) {
    	int(*myadd)(int a, int b);
    	void *handle;
    	handle = dlopen("./libclTest.so", RTLD_LAZY);
    	myadd = dlsym(handle, "add");
    
    	int result = myadd(1, 2);
    
    	dlclose(handle);
    
    	printf("%d\n", result);
    }

    2)编译成可执行文件

    cd到cclTest.c所在目录,输入命令

    gcc -o cclTest cclTest.c -ldl
    生成可执行文件cclTest
    4.执行

    cd到可执行文件cclTest所在目录

    输入命令

    ./cclTest





    展开全文
  • C语言调用汇编和汇编调用C语言

    万次阅读 2017-05-18 12:27:23
    1.C语言调用汇编 程序的入口是main,在main里调用汇编的函数。 在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。 在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数...

    1.C语言调用汇编

    程序的入口是main,在main里调用汇编的函数。

    在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。

    在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段

    #include<stdio.h>
    extern int sum(int a,int b,int c,int d,int e,int f);
    int main(){
        int result = sum(1,2,3,4,5,6);  
        return 0; 
    }
    汇编代码可新建一个sum.asm文件,在工程中添加这个文件即可。        
            AREA    EXAMPLE,CODE,READONLY
            EXPORT    sum
            ENTRY
            
    sum
            ADD R0,R0,R1
            ADD R2,R2,R3
            ADD R0,R0,R2
            
            LDR    R4,[SP]
            LDR R5,[SP,#4]
            
            ADD R4,R4,R5
            ADD R0,R4,R0
            
            BX LR
            
            END
    函数传参:

    4个以内的参数,直接存放在R0~R3 这4个寄存器里面。

    4个以后的参数放在堆栈里。

    如果函数有返回值,那么返回值放在R0里。

    Debug看看编译器是怎么处理的,我们就怎样把参数取出来。

    还是比较易懂

    首先是

    R0 =6   R1=5   R2=4   R3=3

    然后把R1的值放在堆栈里,R13=5,然后R1=2

    然后吧R0的值放在堆栈的下一个位置,R13+4=6,然后R0=1.

    之后就是:

    R0=1,R1=2,R2=3,R3=4

    堆栈里面:

    所以取参数的时候就是:

    LDR    R4,[SP];R4=5
    LDR R5,[SP,#4];R5=6

    把相加的结果放在R0,然后BX LR返回

    可以看到:

    可以验证的确R0是存放返回值的。


    例子:

    ;C语言中extern void macRM68090_WR_CMD(int cmd);  R0 为cmd
        AREA    EXAMPLE,CODE,READONLY
        EXPORT    macRM68090_WR_CMD
        ENTRY
            
    macRM68090_WR_CMD
    	;macRM68090_RS_CLR;macRM68090_CS_CLR 
    	LDR R1, =0x30 
    	ldr r4, =0x40010C14 
    	STR R1, [r4]            ; GPIOB->BRR = 0x10; GPIOB->BRR = 0x20;  
    	          	
    	;macRM68090_8BIT_DATAOUT(cmd&0xFF00); 
    	AND R1, R0, #0xFF00
    	LDR R3, =0x40010C0C
    	AND R3, R3, #0X00FF
    	ORR R2, R1, R3
    	ldr r4, =0x40010C0C 
    	STR R2, [r4]
    	
    	;macRM68090_WR_CLR;macRM68090_WR_SET 
    	LDR R1, =0x08
    	ldr r4, =0x40010C14 
    	STR R1, [r4]             ;GPIOB->BRR = 0x08;
        ldr r4, =0x40010C10 	
    	STR R1, [r4]            ;GPIOB->BSRR = 0x08;  
    	
    	;macRM68090_8BIT_DATAOUT(((cmd<<8)&0xFF00));
    	MOV R2, R0, LSL#8
    	AND R2, R2, #0xFF00
    	LDR R3, =0x40010C0C
    	AND R3, R3, #0x00FF
    	ORR R2, R0, R3
        ldr r4, =0x40010C0C 
    	STR R2, [r4] 
    	
    	;macRM68090_WR_CLR ; 
    	ldr r4, =0x40010C14 
    	STR R1, [r4]  ; GPIOB->BRR = 0x08;   
    	
    	;macRM68090_WR_SET ;macRM68090_CS_SET
    	LDR R1, =0x28  
    	ldr r4, =0x40010C10 
    	STR R1, [r4]  ; GPIOB->BSRR = 0x08; GPIOB->BSRR = 0x20; 
    	
        BX LR
        NOP	
    	END
    
    ;C语言中extern void macRM68090_WR_DATA(int data);  R0 为data
        AREA    EXAMPLE,CODE,READONLY
        EXPORT    macRM68090_WR_DATA
        ENTRY
    	
    macRM68090_WR_DATA
    	;macRM68090_RS_SET
    	LDR R1, =0x10  
    	ldr r4, =0x40010C10 
    	STR R1, [r4]   ; GPIOB->BSRR = 0x10;
    	
    	;macRM68090_CS_CLR 
    	LDR R1, =0x20 
    	ldr r4, =0x40010C14 
    	STR R1, [r4]             ;  GPIOB->BRR = 0x20; 
    	
    	;macRM68090_8BIT_DATAOUT(data&0xFF00);          	
    	AND R1, R0, #0xFF00
    	LDR R3, =0x40010C0C
    	AND R3, R3, #0X00FF
    	ORR R2, R1, R3
    	ldr r4, =0x40010C0C 
    	STR R2, [R4]
    	
    	;macRM68090_WR_CLR;macRM68090_WR_SET 
    	LDR R1, =0x08
    	ldr r4, =0x40010C14 
    	STR R1, [R4]             ;GPIOB->BRR = 0x08; 
    	ldr r4, =0x40010C10 
    	STR R1, [R4]           ;GPIOB->BSRR = 0x08; 
    	
    	;macRM68090_8BIT_DATAOUT(((data<<8) &0xFF00));
    	MOV R2, R0, LSL#8
    	AND R2, R2, #0xFF00
    	LDR R3, =0x40010C0C
    	AND R3, R3, #0x00FF
    	ORR R2, R0, R3
    	ldr r4, =0x40010C0C 
    	STR R2, [R4]
    	
    	;macRM68090_WR_CLR ;  
    	ldr r4, =0x40010C14 
    	STR R1, [r4]  ; GPIOB->BRR = 0x08;  
    	
    	;macRM68090_WR_SET ;macRM68090_CS_SET
    	LDR R1, =0x28 
        ldr r4, =0x40010C10 	
    	STR R1, [R4]  ; GPIOB->BSRR = 0x08; GPIOB->BSRR = 0x20; 
    	
        BX LR
        NOP	
    	END

    Keil: warning: A1581W: Added 2 bytes of padding at address

    KEIL MDK编译警告:

     

    warning: A1581W: Added 2 bytes of padding at address xxx

    image

    原因:

    在Keil 里写汇编代码时如果代码尺寸不对齐,编译器自动补补警告。

     

    处理办法:

     

    加NOP指令,或修改对齐方式

     

     image


    展开全文
  • 1.c语言不能直接调用c++库,因为c++编译后符号名会被调整,需要把c++库按...2.c++调用c语言库,只需要用extern "C" {}包裹一下库的头文件即可 参考:https://blog.csdn.net/shaosunrise/article/details/81176880 ...
  • 先来看看,操作步骤:1.在matlab中新建文件代码如下:#include "mex.h" //头文件必须包含mex.hdouble ... //C语言算法程序声明,在最后调用时,第一// 个参数是返回结果//c语言到matlab变换,以mexFunction命...
  • C语言调用matlab引擎

    2016-10-22 16:50:22
    利用C语言调用matlab引擎。
  • 51单片机C语言调用汇编子程序的简便方法
  • C语言调用DLL

    2013-03-12 21:49:23
    使用c语言调用dll 博文地址http://blog.csdn.net/dengnanyi/article/details/8665379
  • 使用步骤: 1> 编译好自己的动态连接库2> 利用ctypes载入动态连接库3> 用ctype调用C函数接口时,需要将python变量类型做转换后才能作为函数参数,转换原则见下图: 4> Python若想获取ctypes调用的C函数返回有人在...
  • 1、C++中调用C语言程序 main.cpp文件 #include <iostream> #include "cfun.h" using namespace std; int main() { cout << "C++ Hello world!" << endl; cfun(); return 0; } #if 0 ...
  • C语言中,函数调用的一般形式为:函数名(实际参数表)对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。#include<stdio.h>intfun(intx,...
  • 在C语言中调用java语言的方法!对初学者很不错的实例!Android jni开发之C语言调用java语言
  • C语言调用Lua代码

    2013-02-11 22:47:05
    在Linux底下,从C语言调用Lua代码的一个简单例子。
  • C语言调用python(1)(无参数传递)1:Python简介Python是一种脚本语言,不需要编译就可以被直接运行,只要编写完程序后修改文件的属性为可执行,就可被运行。2:C语言调用python的步骤2.1:Ubuntu下首先要配置...
  • c语言调用matlab 例子

    2011-12-12 23:03:08
    c语言调用matlab引擎!!通过一个实例来说明!
  • c语言调用枚举类型函数 C语言中的函数调用类型 (Types of Function calls in C) Functions are called by their names, we all know that, then what is this tutorial for? Well if the function does not have ...
  • C语言调用JAVA的例子

    热门讨论 2009-04-18 13:38:26
    C语言调用JAVA的例子,一个用C语言如何调用JAVA的例子,调用里面的方法 一个用C语言如何调用JAVA的例子,调用里面的方法 一个用C语言如何调用JAVA的例子,调用里面的方法 一个用C语言如何调用JAVA的例子,调用里面的方法 ...
  • 主要介绍了C语言调用Python代码的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
  • 我创建了一个c程序,以便在调用某个特定函数时,它应该创建文本文件,这是c...如何用c语言调用函数时重复写入文本文件function() {FILE *fp;char ch;time_t current_time;char* c_time_string;/* Obtain current tim...
  • 在S3c2440下的裸板程序调用C语言顺序点亮led
  • python调用c语言函数We can call a C function from ... 我们可以使用ctypes模块从Python程序调用C函数。 从Python调用C函数 (Calling C Function from Python) It involves the following steps: 它涉及以下步...
  • Python调用C语言的方式CTYPES,SWIG,BOOST.PYTHON,CYTHONpython是解释型语言,只能调用c的动态链接库。那什么是库,什么是静态库与动态库?库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多...
  • C语言调用python脚本

    千次阅读 2019-06-29 12:47:19
    python提供了C语言的API,可以使用C语言调用python脚本。 参考链接:https://docs.python.org/3/c-api/ API接口函数很多,一时半会儿也看不完,先快速实现在C语言程序内执行py脚本再说吧,做个笔记。 #define Py...
  • 讨论¶如果你在C语言调用Python,要记住最重要的是C语言会是主体。也就是说,C语言负责构造参数、调用Python函数、检查异常、检查类型、提取返回值等。作为第一步,你必须先有一个表示你将要调用的Python可调用...
  • c语言调用sqlite数据库

    2007-06-27 15:46:33
    c语言调用sqlite数据库中表的内容,非常实用
  • c语言调用c++

    2015-01-15 22:54:15
    c++是c语言的扩展,c语言里面没有类的概念。所以,以前我一直以为只有c++可以调用c语言的库。 今天才发现原来c也可以调用c++的库。
  • 最近在做一个漏洞展示平台,攻击实现部分使用python实现,c语言实现部分使用libcli库做一个类似telnet的东东,回调函数run的时候调用python模块。针对c调用python,做个了小demopython模块:demo.pydef print_arg...
  • 虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成。这样,就需要用python来调用c的代码了具体...以下示例:通过python调用c函数,返回"hello,world 字符串"新建c语言文件 hello.ctouch hello.c#includ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,421,233
精华内容 1,368,493
关键字:

c调用c