首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

extern"C"对C有影响吗?

在C++中,extern "C"用于告诉编译器采用C语言的链接约定。这是因为C++支持函数重载,所以在编译时会根据函数的参数类型和名称生成不同的符号,而C语言没有函数重载特性,所以它的符号名称与C++不同。

当你在C++代码中调用C语言编写的函数时,需要使用extern "C"来声明该函数,以确保链接器能够正确地找到该函数。这是因为C++编译器会使用C++的链接约定来编译和链接代码,而C语言编译器则使用C的链接约定。

例如,在C++代码中调用C语言函数printf时,应该这样声明:

代码语言:cpp
复制
extern "C" int printf(const char* format, ...);

这样,编译器就会使用C语言的链接约定来查找printf函数,从而正确地调用它。

因此,extern "C"对C语言的影响主要体现在链接约定上,它能够确保C++代码能够正确地调用C语言编写的函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CC++混合编译,externextern C

但是,C++毕竟是一种面向对象的设计语言,为了支持函数的重载,C++全局函数的处理方式有着明显的不同。    ...首先看一下C++类似C的函数是怎样编译的:    作为面向对象的语言,C++为了支持函数重载,函数在被C++编译后在符号库中的名字与C语言的不同。...被externC”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话来概括externC”的真实目的:实现C++与C的混合编程。..."cExample.h"; }   而在C语言的头文件中,其外部函数只能指定为externC语言中不支持externC”,会报编译错误。   ...(2) C中引用C++语言中的函数或者变量时,C++的头文件需要加上externC”,但是C语言中不能直接引用声明了externC”的该头文件,应该仅在C中将C++中定义的externC”函数声明为

3.5K11
  • __cplusplus、externC”关键字

    我们在阅读程序时,经常会见到__cplusplus关键字,比如下面的代码: #ifdef __cplusplus extern "C" { #endif void *memset(void* ,int..., size_t); #ifdef __cplusplus } #endif 这里面,两种关键字,都是为了实现C++与C兼容的,externC”是用来在C++程序中声明或定义一个C的符号...,比如: externC” { int func(int); int var; } 上面的代码,C++编译器会将在externC”的大括号内部的代码当做C语言来处理...由于CC++毕竟是不同的,为了实现某个程序在CC++中都是兼容的,如果定义两套头文件,未免太过麻烦,所以就有了__cplusplus的出现,这个是在C++中特有的,__cplusplus其实就是C+...+,也就有了上面第一段代码的使用,如果这段代码是在C++文件中出现,那么经过编译后,该段代码就变成了: /**********C++文件中条件编译后结果***************/ extern "

    38420

    extern C的作用

    这个方法,细心的朋友会发现有一行extern "C",那这个有什么作用呢,能不能删除?...env->NewStringUTF(hello.c_str()); } 删除extern "C" 实践是检验真理的最好手段,我们删除一下extern "C"试试,虽然编译通过了,但是程序运行出现了闪退...extern "C"的作用到底是什么呢?...4.动态注册的JNI接口,就不用担心这个问题,所以不用加extern "C" 进一步思考 很多时候我们会碰到一些头文件中声明了C语言的函数,但是这个头文件会被C语言或者C++语言使用。...但是在C++语言中就会将memset函数修饰成_Z6memsetPvii, 这样子链接器就无法与C库中的memset的链接了,所以必须使用extern "C",但是C语言又不支持extern "C",如果为了兼容

    69930

    C盘的剩余空间对开机速度有影响

    C盘作为系统盘,如果剩余 空间不足肯定会影响到开机的速度。所以一般在装机的时候C盘的空间预留的稍微大一些,就是为了腾出足够多的剩余空间,这样安装的文件不至于占满整个C盘空间。 ?...如果机器的内存配置不够很多软件加载不到内存的空间也会导致运行的速度变得奇卡无比,其实计算运行的速度基本上都归结于这两个原因,回到系统C盘的问题,如果空间不足了就会让系统安装的应用加载速度变慢,特别是一些大型的软件运行的时候还需要借助一部分的硬盘空间...如果同时启动应用数量过多也会严重拖延系统的开机时间,因为加载的应用需要同时消耗内存和CPU,关键还是内存因为现在很多应用开机的时候就占据了内存,如果应用过多提早把系统的内存给占据了也会导致系统启动变慢,C盘如果空间太小很多应用加载特别是涉及到交换分区的时候就会变得缓慢...平时在使用电脑的过程中注意一些细节也会避免系统盘被提早占满,在安装应用软件的时候尽量把安装位置放在C盘之外的地方,这样子容易减少系统盘的负担,而且减少应用开机启动的数量,同时不间断的对于系统进行杀毒和木马的处理

    3.8K40

    C语言】extern 关键字

    创作者~周榜109﹣总榜883⇿全网访问量35w+ 本文由 謓泽 原创 CSDN首发如需转载还请通知⚠ 个人主页-謓泽的博客_CSDN博客  欢迎各位→点赞 + 收藏⭐️ + 留言​ 系列专栏-【C语言...】关键字_謓泽的博客 ✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本 ⑩② extern ⇿ 外部声明 ⒈描述⇢extern 变量称之为外部存储变量。...test.c 文件 #define _CRT_SECURE_NO_WARNINGS 1 #include extern Add(int x, int y); int main(void...{ int x = 20; int y = 30; int ret = Add(x, y); printf("ret = %d\n", ret); return 0; } Add.c文件...拓展⇢一般来说用包括的是C语言当中的头文件或者是库函数当中的头文件," "是自己使用自己所自定义的头文件[约定俗称的规矩],实际上.c源文件,我们只需要在.h头文件当中加上去就可以了。

    66010

    InnoDB索引允许NULL性能有影响

    问题1:索引列允许为NULL,性能影响有多少 结论1,存储大量的NULL值,除了计算更复杂之外,数据扫描的代价也会更高一些 2....问题4:索引列允许为NULL,会额外存储更多字节 结论4,定义列值允许为NULL并不会增加物理存储代价,但对索引效率的影响要另外考虑 5. 几点总结 6....问题1:索引列允许为NULL,性能影响有多少 把辅助索引列 c1 修改为允许NULL,并且随机更新5万条数据,将 c1 列设置为NULL [root@yejr.run]> alter table t_sk...问题4:索引列允许为NULL,会额外存储更多字节 之前流传有一种说法,不允许设置列值允许NULL,是因为会额外多存储一个字节,事实是这样?...列值允许为NULL更多的是计算代价变大了,以及索引索引效率的影响,反倒可以说是节省了物理存储开销。

    4.4K31

    【面试宝典】c调用c++函数,为什么要加extern c

    首先,作为externC/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。...),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中C的函数是怎样编译的: 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。...加extern "C"声明后的编译和连接方式 加extern "C"声明后,模块A的头文件变为: // 模块A头文件 moduleA.h #ifndef MODULE_A_H #define MODULE_A_H...extern"C"int foo( int x, int y ); #endif 在模块B的实现文件中仍然调用foo( 2,3 ),其结果是: (1)模块A编译生成foo的目标代码时,没有其名字进行特殊处理...如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。

    1.9K140

    C语言笔记】extern关键字

    extern声明变量 示例程序: test.h如下: //声明 extern int a; extern int b; test.c如下: #include "test.h" //定义 int a =...("a = %d , b = %d\n", a, b); return 0; } 其中,a,b的声明也可放在main.c中,代码如下: #include extern int...//extern关键字可要可不要 test.c如下: #include "test.h" //定义 int a = 520; int b = 1314; int add(int a, int b)...externCexternC”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上externC”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。...因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而externC”就是其中的一个策略。

    1.1K30

    InnoDB索引允许NULL性能有影响

    问题1:索引列允许为NULL,性能影响有多少 结论1,存储大量的NULL值,除了计算更复杂之外,数据扫描的代价也会更高一些 2....问题4:索引列允许为NULL,会额外存储更多字节 结论4,定义列值允许为NULL并不会增加物理存储代价,但对索引效率的影响要另外考虑 5. 几点总结 6....问题1:索引列允许为NULL,性能影响有多少 把辅助索引列 c1 修改为允许NULL,并且随机更新5万条数据,将 c1 列设置为NULL [root@yejr.run]> alter table t_sk...问题4:索引列允许为NULL,会额外存储更多字节 之前流传有一种说法,不允许设置列值允许NULL,是因为会额外多存储一个字节,事实是这样?...列值允许为NULL更多的是计算代价变大了,以及索引索引效率的影响,反倒可以说是节省了物理存储开销。

    1.2K20

    【编程基础】extern C的用法解析

    但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++全局函数的处理方式与C有明显的不同。...被extern "C"修饰的变量和函数是按照C语言方式编译和连接的;   未加externC”声明时的编译方式   首先看看C++中类似C的函数是怎样编译的。   ...extern "C" int foo( int x, int y ); #endif 在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:   (1)模块A编译生成foo的目标代码时,没有其名字进行特殊处理..." }   而在C语言的头文件中,其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。   ...(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"

    98330

    C++ 中 extern 数组和指针

    在一次使用 extern 声明全局变量的过程中,因为数组和指针的混用引发了错误。 我们知道,C++ 中使用 extern 来声明在其他(未使用 include 包含的)文件中的全局变量。...extern char * a; 这是一个外部变量的声明,它声明了一个名为 a 的字符指针,编译器看到这个声明就知道不必为这个指针变量分配空间,这个 .cpp 文件中所有指针 a 的引用都化为一个不包含类型的标号...这里问题就出现了:由于在这个文件中声明的 a 是一个指针变量而不是数组,链接器的行为实际上是把指针 a 自身的地址定位到了另一个 .c 文件中定义的数组首地址之上,而不是我们所希望的把数组的首地址赋予指针...补充 extern 知识 另外补充一些 extern 知识 extern "C":按照 C 语言的标准编译代码,主要是符号不同。...extern int i = 0;:定义,extern 可以省略,i 可以在其他文件中使用。 extern int i;:声明,i 在其他文件中定义。 int i:定义,分配了空间但未初始化。

    41700

    extern C 关键字的作用

    决定了在编译过程中是否函数进行倾轧(Name Mangling)操作,也是在今天才知道倾轧这个词语。...而真正在编译后,函数名字并不是我们想象中真的一模一样,而是C++编译器在内部函数名进行了倾轧操作,将相同函数名而不同形参的函数利用某些固定规则进行了改名操作,调用过程中不会因为函数名个冲突而导致出现错误...+编译器不对函数进行倾轧,可以使用 externC” 关键字,让其使用C语言的方式导出函数。...#include // 使用 C++ 编译器编译后的dll导出的所有函数都会倾轧 // 增加 externC” 关键字 externC” { _declspec(dllexport...实现如下: #include // 使用 C++ 编译器编译后的dll导出的所有函数都会倾轧 // 增加 externC” 关键字 #ifdef __cplusplus extern

    19620
    领券