CUDA编程中 extern "c"用法解析

本文介绍了在CUDA编程中extern 'C'的关键作用,解释了它如何指示编译器按照C语言的方式处理函数,以解决C++与C语言混合编程时的链接问题。通过举例说明了未加extern 'C'声明时的链接错误,以及添加后的正确编译和链接方式,并探讨了extern 'C'的含义和extern类型的作用。
摘要由CSDN通过智能技术生成

简介

  extern “c”并不是什么新鲜的东西,但是最在编译CUDA程序时候出现了“error LNK2019,未定义的符号”的问题。这不用说了,链接器说找不到,那就是找不到咯。但是why?我的源码中明明已经有了定义。
后来发现是extern “c”的问题。

extern “C”

  C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。
extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。这很重要!由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
  如果两份代码,一份以C标准编译,一份以C++标准编译,那么链接时候就会出现error LNK2019,未定义的符号”的问题。因为链接时,C版本和C++版本的实际签名不一样。同样的,你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL输出(Export)的函数,你需要用extern “C”来强制编译器不要修改你的函数名。

extern “C”真正含义

  请注意理解extern “C”的真正含义,extern “C” 包含两层意思:

  • 被它修饰的目标是“extern”类型的;
  • 其次,被它修饰的目标是“C-type”的。

因为C++通常被认为是C的超集,导致我们在理解时候有误,认为C的代码一定可以用C++编译器编译。现在看来,还是有很多误区。下面详细讲讲extern “C” 包含的两层意思。

extern类型

  extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
  通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在链接阶段中从模块A编译生成的目标代码中找到此函数。
  与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰。

extern “C”是按照C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值