精华内容
下载资源
问答
  • C中调用C++函数C++中调用C函数

    千次阅读 2017-09-21 16:53:00
    C中调用C++函数 将 C++ 函数声明为``extern "C"''(在C++ 代码里做这个声明),然后调用它(在 C 或者 C++ 代码里调用)。例如: // C++ code: extern "C" void f(int); void f(int

    转自:http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html

    C中调用C++函数

    将 C++ 函数声明为``extern "C"''(在C++ 代码里做这个声明),然后调用它(在 C 或者 C++ 代码里调用)。例如:

    // C++ code:
    extern "C" void f(int);
    void f(int i)
    {
         // ...
    }

    然后,可以这样使用 f():

    /* C code: */
    void f(int);
    void cc(int i)
    {
        f(i);   /* ... */
    }
    当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:

    // C++ code:
    class C
    {
           // ...
           virtual double f(int);
    };
     
    extern "C" double call_C_f(C* p, int i) // wrapper function
    {
           return p->f(i);
    }

    然后,就可以这样调用 C::f():

    /* C code: */
    double call_C_f(struct C* p, int i);
     
    void ccc(struct C* p, int i)
    {
           double d = call_C_f(p,i);
           /* ... */
    }

    如果想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如:

    // C++ code:
    void f(int);
    void f(double);
     
    extern "C" void f_i(int i) { f(i); }
    extern "C" void f_d(double d) { f(d); }

    然后,你可以这样使用每个重载的 f():

    /* C code: */
    void f_i(int);
    void f_d(double);
     
    void cccc(int i,double d)
    {
           f_i(i);
           f_d(d);
           /* ... */
    }

    注意,这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件。


    而C++调用C,extern "C" 的作用是:让C++连接器找调用函数的符号时采用C的方式 如:

    // C Code
    void foo( int x );

    C++这样调用C函数

    // C++ code:
    extern "C" void foo(int);
    void f(int i)
    {
         // ...
        foo(i);
    }

    就是让C++连接器能过类似于_foo来查找此函数,而非类似于_foo_int这样的符号。



    展开全文
  • C++和js相互调用是个有意思的事情。...一、js中调用C++函数函数原型int g_FunSub(int x,int y); 调用方式如下: function CallCppFunSub(x,y) { var num = window.external.g_FunSub(x,y);

    C++和js相互调用是个有意思的事情。

    一、js中调用C++函数。函数原型

    int g_FunSub(int x,int y);

    调用方式如下:

    <html>  
    <head>  
        <meta charset="utf-8" />  
        <title></title>  
        <script language="javascript">  
            function CallCppFunSub(x,y)  
            {
    			var num = window.external.g_FunSub(x,y); 
    			alert(num);
    			return num
            } 
    		function JsFunSub(x,y)  
            {
    			var num = x - y;
    			alert(num);
    			return num
            }
        </script>  
    </head>  
    <body>
        <button type="button" οnclick="CallCppFunSub(4,7)">调用C++函数</button>  
    </body>  
    </html> 
    具体实现是在C++代码中写的:

    #pragma once
    
    class CWebBrowserExUI :
    	public CWebBrowserUI
    {
    public:
    	CWebBrowserExUI();
    	~CWebBrowserExUI();
    
    	LPCTSTR GetClass() const;
    	LPVOID GetInterface(LPCTSTR pstrName);
    
    	virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(__RPC__in REFIID riid, __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId);
    	virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
    
    	virtual HRESULT STDMETHODCALLTYPE GetExternal(IDispatch **ppDispatch)
    	{
    		//重写GetExternal返回一个ClientCall对象
    		*ppDispatch = this;
    		return S_OK;
    	}
    };
    

    #include "stdafx.h"
    #include "WebBrowserExUI.h"
    #include <atlcomcli.h>
    
    
    int g_FunSub(int x, int y)
    {
    	return (x - y);
    }
    
    CWebBrowserExUI::CWebBrowserExUI()
    {
    }
    
    
    CWebBrowserExUI::~CWebBrowserExUI()
    {
    }
    
    
    LPCTSTR CWebBrowserExUI::GetClass() const
    {
    	return _T("WebBrowserExUI");
    }
    
    LPVOID CWebBrowserExUI::GetInterface(LPCTSTR pstrName)
    {
    	if (_tcsicmp(pstrName, _T("WebBrowserEx")) == 0)
    		return static_cast<CWebBrowserExUI*>(this);
    
    	return CActiveXUI::GetInterface(pstrName);
    }
    
    
    HRESULT CWebBrowserExUI::GetIDsOfNames(const IID& riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId)
    {
    	//DISP ID 从200开始
    	if (_tcscmp(rgszNames[0], _T("g_FunSub")) == 0)
    		*rgDispId = 500;
    
    	return S_OK;
    }
    
    HRESULT CWebBrowserExUI::Invoke(DISPID dispIdMember, const IID& riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
    {
    	//MyOutputDebugStringW(L"%d\n", dispIdMember);
    	switch (dispIdMember)
    	{
    	case 500:
    	{
    		// 注意参数顺序,反向
    		VARIANTARG *varArg = pDispParams->rgvarg;
    		int x = _ttoi(static_cast<_bstr_t>(varArg[1]));
    		int y = _ttoi(static_cast<_bstr_t>(varArg[0]));
    		int n = g_FunSub(x, y);
    		*pVarResult = CComVariant(n);
    		return S_OK;
    	}
    
    	default:
    		break;
    	}
    
    	return CWebBrowserUI::Invoke(dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
    }
    



    二、C++调用js方法。

    function JsFunSub(x,y)
    C++中这么调用:

    void CMainFrameWnd::OnClick(TNotifyUI& msg)
    {
    	CDuiString sCtrlName = msg.pSender->GetName();
    
    	if (sCtrlName.CompareNoCase(_T("CallJsBtn")) == 0)
    	{
    		// C++调用js方法,示例
    		// 注意参数顺序,反向
    		VARIANT arg[2] = { CComVariant(7),CComVariant(3)};//JsFunSub(3,7)
    		VARIANT varRet;
    		m_pBrowser->InvokeMethod(m_pBrowser->GetHtmlWindow(),_T("JsFunSub"),&varRet,arg,2);
    		int nResult =  varRet.intVal;//-4
    		return;
    	}
    
    
    	WindowImplBase::OnClick(msg);
    }

    js中这样实现:

    <html>  
    <head>  
        <meta charset="utf-8" />  
        <title></title>  
        <script language="javascript">  
            function CallCppFunSub(x,y)  
            {
    			var num = window.external.g_FunSub(x,y); 
    			alert(num);
    			return num
            } 
    		function JsFunSub(x,y)  
            {
    			var num = x - y;
    			alert(num);
    			return num
            }
        </script>  
    </head>  
    <body>
        <button type="button" οnclick="CallCppFunSub(4,7)">调用C++函数</button>  
    </body>  
    </html> 

    C++调用javascript请移步这里:http://blog.csdn.net/sunflover454/article/details/60570940


    示例工程下载地址(VS2013):

    http://download.csdn.net/detail/sunflover454/9774299

    展开全文
  • C++中调用main函数

    千次阅读 2017-09-18 22:26:34
    之前一直以为main函数不能被调用,今日突发奇想,既然都是函数,他为啥就那么特殊呢~~~于是乎小试了一下,很简单的操作,各位大牛勿喷…… 意料的死循环……

           之前一直以为main函数不能被调用,今日突发奇想,既然都是函数,他为啥就那么特殊呢~~~于是乎小试了一下,很简单的操作,各位大牛勿喷……

    意料中的死循环……

    展开全文
  • ROS工程中C++调用python函数

    千次阅读 2018-06-09 20:15:34
    在ROS api程序,大部分函数的实现是用...在C++调用python函数C++调用python函数,python中用有Python.h头文件起到了很大作用。相关的函数介绍可在 Extending Python with C or C++ 找到。(这个是针对python...

    在ROS api程序中,大部分函数的实现是用的python,python语言简单易学,特别做一些测试和调试非常简单。

    因此,在C++中调用python函数会极大地减少工作量。


    在C++中调用python函数


    C++调用python函数,python中用有Python.h头文件起到了很大作用。相关的函数介绍可在 Extending Python with C or C++ 中找到。(这个是针对python2.7的说明)。

    在ros工程中,需在CMakeLists.txt中添加相关依赖项即可,关键代码如下:

    link_directories(/usr/lib/python2.7/config-i386-linux-gnu)
    
    include_directories(${catkin_INCLUDE_DIRS} /usr/include)
    
    add_executable(test src/test.cpp)
    target_link_libraries(test ${catkin_LIBRARIES} python2.7)   //用于找到libpython2.7.so库

    关于C++部分代码如下:

    #include <ros/ros.h>
    #include <iostream>
    #include <python2.7/Python.h>
    
    int main()
    {
        Py_Initialize();
    
        PyRun_SimpleString("print 'test simple demo'");
    	//load python functions 
        PyRun_SimpleString("import sys");
        std::string dirs = std::string("sys.path.append('/home/user/test/')");
        PyRun_SimpleString(dirs.c_str());
        //load module
        PyObject *module = PyString_FromString("for_test");
        PyObject *pyModule = PyImport_Import(module);
        if(!pyModule) //failed
        {
            std::cout << "Get python module failed." << std::endl;
            return 0;
        }
        //load function
        PyObject *pyfun = PyObject_GetAttrString(pyModule, "main");
        if(!pyfun || !PyCallable_Check(pyfun))
        {
            std::cout << "Cannot find python function" << std::endl;
            return 0;
        }else{
            std::cout << "load python funtion ok" << "\n";
        }
        //callback funtion
        PyObject *argss = PyTuple_New(1);
        PyObject *arg = PyString_FromString("127.0.0.1");
        PyTuple_SetItem(argss, 0, arg);
        PyObject *pyRes = PyObject_CallObject(pyfun, argss);
        //get result
        if(pyRes)
        {
            std::string ret = PyString_AsString(pyRes);
            std::cout << "result: " << ret << "\n";
        }
    
        Py_Finalize();
        return 0;
    }

    其for_test.py的python代码如下:

    import logging
    import socket
    import time
    
    def main(ip):
        proctime = time.strftime("%y%m%d_%H%M%S")
        logging.basicConfig(level=logging.INFO, filename=proctime+'.log')
        logging.info("Start program")
        port = 8080
        clientsocket_ = socket.create_connection((ip, port))
        clientsocket_.send("for test")
        logging.info("write file success")
        logging.info("Ending program")
        return "Test OK"
    
    if __name__ == "__main__":
        main("127.0.0.1")         ## 运行前提为开启了服务器端

    上面例子是传入一个参数并得到返回值的python函数调用,更多的调用方式可在网上找到大量相关资料。注意将for_test.py文件放到/home/user/test/下,否则会找不到相应python模块。

    通过上述例子,便可以很方便地实现python调用。

    不过,发现调用ros自身提供的python函数,比如rostopic中的get_topic_type("/rosout")函数,rosservice中的get_service_list()函数,这些函数都非常好用非常方便。只是通过上述方法总是调用不成功,会出现以下提示:


    说“'module' object has no attribute 'argv'" in <module 'threading' from '/usr/lib/python2.7/threading.pyc'> ignored”。但即使删除了threading.pyc也还是不行,原因暂时不明,不知道是否有人已经解决。


    展开全文
  • C++调用MATLAB函数

    万次阅读 热门讨论 2019-03-15 20:18:44
    MATLAB具有着很高的计算性能,一些算法用MATLAB很容易实现,而用C++很难实现,如果想在C++中调用MATLAB编写的函数,可以将该函数编译成库文件,之后在C++中对其进行调用。 本文详细讲解如何将MATLAB函数编译成库,...
  • C/C++:调用函数来初始化全局变量

    千次阅读 2017-06-23 16:36:32
    C/C++:调用函数来初始化全局变量
  • C++中调用C语言函数

    千次阅读 2019-05-30 15:56:50
    main.cpp #include <iostream> #include"test.h" ...//在C++中调用C函数 //extern "C" void show(); //一个一个函数调用的方法 int main() { show(); return 0; } test.h #ifndef TEST_...
  • 我在自学windows程序设计,有关进程和线程的概念不太清楚。如题,两者区别是调用线程函数不影响主线程的进行,而直接调用函数需要等待函数返回,不知道我这样理解对不对,恳请前辈们指教。
  • c++中构造函数的相互调用

    千次阅读 2018-07-28 22:54:39
    c++中构造函数的相互调用
  • c++中执行文件指:main函数 函数文件:其他所有需要用到的函数c++中函数文件名没有特殊讲究,将文件添加到工程目录便能使用 对函数的要求有三点 函数的完整文件 输入参数的定义 函数声明加入头文件 1.函数的...
  • C++中构造函数调用其他函数

    千次阅读 2013-08-30 16:43:55
    C++析构函数中调用虚函数 #include using namespace std; class Base { public: Base() {cout ; foo();} //virtual ~Base() {cout ; foo();} virtual void foo() {cout ; } }; class Derived : public Base...
  • c++调用静态函数的方法

    千次阅读 2020-08-09 13:09:25
    今天在写c++程序时,发新现在的gcc和vc++对于静态函数调用方式有所改变,在旧标准的c++中调用类的静态方法只能用类名::函数名的方式,在新的标准,类的对像也可以像调用类的方法一样调用静太函数。示例如下: ...
  • C++中调用DLL函数

    千次阅读 2017-04-01 23:31:29
    C++调用dll
  • 上一篇博客介绍了如何配置C++调用Python环境: C++调用Python环境配置 调用的Python函数hello.py: def add_num(a,b): return a+b C++调用Python: #include &amp;lt;Python.h&amp;gt; #include&...
  • C++显示调用函数和行号文件名

    千次阅读 2012-09-04 16:30:04
    printf("调用函数 %s, %u行 \n", __FUNCTION__, __LINE__); } void fun2() { printf("调用函数 %s, %u行 \n", __FUNCTION__, __LINE__); } int _tmain(int argc, _TCHAR* argv[]) { printf("exe编译时间:%s, %...
  • 1、C调用C++ 本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在 wrapper的实现文件里实现。 //------apple.h #ifndef __APPLE_H__ #define __...
  • 如果你定义的函数在main函数之后,而且在main函数前没有进行该调用函数的声明那么当在main函数中调用的该函数系统将不认识他,会有错误提示的,如果你定义的函数在main函数之前,那么就没事了。总之记住C程序中总是...
  • C++中怎么调用C函数

    千次阅读 2018-05-17 11:54:54
    关于“C++中怎么调用C函数”的方法,之前有浏览过大牛的文章,貌似有好几种方法。 作为小白,this my way. /* File: parse.h * Purpose: simple parser for data files, includeing args parsing */ #ifndef ...
  • C++中构造函数调用函数吗?

    万次阅读 热门讨论 2011-08-31 00:07:49
    环境:XPSP3 VS2005 ... 今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码: class Base { public: Base() { Fuction(); }
  • C++函数调用过程和内置函数详解

    千次阅读 2018-03-12 10:15:01
    ③执行被调用函数中函数体的语句;④流程返回调用函数的下一条指令处,将函数返回值带回;⑤接着执行主调函数未执行的语句。  这样就要求在转到被调用函数之前,要记下当时执行的指令的地址,还要“保护现场”...
  • UdpBroadcast.h文件创建一个类及成员函数的声明,UdpBroadcast.cpp包含成员函数的实现方法。 VADettask.cpp调用UdpBroadcast.h的函数成员显示 undefined reference to `UdpBroadcast::UdpSocketCreate() ...
  • c++构造函数中调用构造函数

    千次阅读 2019-02-27 19:21:01
     本人不是很懂c++,只是平时仿真的时候,用一点,对于其一些约定就不是很熟,于是今天就栽在一个bug上了。  示例代码如下: #include &lt;iostream&gt; using namespace std; class Sender{ public: ...
  • c++中成员函数调用过程

    千次阅读 2018-10-15 16:51:34
    成员函数调用过程 假如我们调用p-&gt;mem():   1.首先确定p的静态类型。 2.在p的静态类型查找mem()。如果找不到,则依次在直接基类不断查找直到继承链的顶端。 3.一旦找到了mem...
  • 我学了C++,就是想用MFC实现类似C++函数功能,比如我在主函数外部定义了一个自己的函数,然后再主函数里边调用这个函数。 比如我定义了一个函数max(int a, int b)来返回a和b最大的那个数,我在主函数里直接...
  • C++ 构造函数中调用虚函数

    千次阅读 2016-07-29 15:03:27
    我们知道:C++中的多态使得可以根据对象...那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A { public: A ():m_iVal(0){test();} virtual void func() { std::cout‘ ’;} void test(){
  • #include #include #include using namespace std; int add(int i,int j){ return i+j; } int sub(int i,int j){ return i-j;...上述的代码就是通过“add”、“sub”字符串调用add和sub函数
  • C++ 一个函数调用其他.cpp文件函数

    万次阅读 多人点赞 2018-09-26 17:50:20
    使用VC或VS创建C++项目的时候,会自动产生许多文件夹,其中有一个文件夹->源文件: 在该文件下可以自定义许多...当然这里C++是提供一个文件调用其他文件中函数的功能的, 这就可以让我们自定义一个只包含main()...
  • C++:构造函数中调用虚函数

    千次阅读 2020-01-08 20:25:33
    如果构造函数调用函数的话,基类的构造函数调用基类的虚函数。派生类的构造函数调用派生类自身的虚函数。派生类实例化的时候,会先调用基类的构造函数,这时候就是调用基类自身的虚函数。然后,派生类调用自身的...
  • C++ sort排序函数用法

    万次阅读 多人点赞 2017-07-27 21:35:06
    最近在刷ACM经常用到排序,以前老是写冒泡,可把冒泡带到OJ里后发现经常超时,所以本想用快排,可是很多学长推荐用sort函数,因为自己写的快排写不好真的没有sort快,所以毅然决然选择sort函数 用法 1、sort函数...
  • C++何时调用构造函数,何时调用析构函数

    万次阅读 多人点赞 2018-10-13 20:50:40
    在我们创建新的对象的时候,都要执行某一个类中的构造函数,而当构造函数中分配了资源之后,当我们销毁一个对象的时候需要一个相应的操作将这些资源释放出去,这就需要析构函数。 一般来说,在有基类和派生类存在时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 793,096
精华内容 317,238
关键字:

c++中怎么调用函数

c++ 订阅