Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++:能区分出"C“函数和普通函数吗?

C++:能区分出"C“函数和普通函数吗?
EN

Stack Overflow用户
提问于 2017-08-30 18:53:02
回答 1查看 99关注 0票数 1

在编译时可以区分extern "C"函数和非extern "C"函数吗?

它们有非常不同的行为,显然,它们被允许有不同的调用约定(参见https://stackoverflow.com/a/45968482/931154)。

下面的代码片段建议使用编译时可用的信息来区分它们。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <type_traits>

int cpp_add(int x, int y) { return x + y; }

extern "C" int c_add(int x, int y) { return x + y; }

typedef decltype(cpp_add) cpp_t;
typedef decltype(c_add) c_t;

constexpr bool sameness = std::is_same<cpp_t, c_t>::value;

int main(int argc, char *argv[]) {
  if (sameness)
    std::cout << "same" << std::endl;
  else
    std::cout << "different" << std::endl;
  return 0;
}

在OS上用gccclang打印gccclang

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
% g++ --std=c++11 externcsame.cpp && ./a.out
same

% clang++ --std=c++11 externcsame.cpp && ./a.out
same
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-31 04:39:03

C链接函数和C++链接函数有不同的类型,即使它们采用相同的参数类型并返回相同的类型。(嗯,听起来很熟悉)。但是大多数编译器并不强制执行这个规则,而是将它们视为相同的类型。(嗯,听起来很熟悉)。

例如,C++标准指定std::qsort具有两个重载,一个以C链接函数作为比较函数,另一个以带有C++链接的函数作为比较函数。这只是简单的重载,当您使用任何函数类型调用std::qsort时,编译器应该选择适当的重载。

所以,是的,std::is_same应该是区分这两种类型所需要的全部。但是,同样,大多数编译器并不将它们视为不同的类型。如果您有其中一个编译器(几乎可以肯定),那么它们的类型是相同的,您无法区分它们。因此,例如,这些编译器的标准库只有一个版本的std::qsort

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45972489

复制
相关文章
c++之普通函数和模板函数的区别
1.普通函数调用时可以发生自动类型转换(隐式类型转换); 2.函数模板调用时,如果利用类型自动推导,不会发生隐式类型转换; 3.如果利用显示指定类的方式,可以发生隐式类型转换; #include<iostream> using namespace std; int myAdd(int a, int b) { return a + b; } template<class T> T myAdd2(T a, T b) { return a + b; } void test() { int
西西嘛呦
2020/08/26
6270
c++之普通函数和模板函数的调用规则
1.如果模板函数和普通函数都可以实现,则优先调用普通函数。 2.可以通过空模板参数列表来强制调用模板函数; 3.函数模板也可以重载; 4.如果函数模板可以产生更好的匹配,优先调用函数模板; #include<iostream> using namespace std; int myAdd(int a, int b) { cout << "调用普通函数" << endl; return a + b; } template<class T> T myAdd(T a, T b) { co
西西嘛呦
2020/08/26
8850
C++ 类模板中成员函数和普通函数创建时机
类模板中成员函数和普通函数创建时机是有区别的: 普通类中的成员函数一开始就创建; 类模板中的成员函数在调用时才创建。 #include<iostream> using namespace std; class Demo1{ public: static void show_demo1(){ cout<<"This is Demo1."<<endl; } }; class Demo2{ public: static void show_demo2(){
耕耘实录
2022/05/09
1.2K0
【C++】C++构造函数和析构函数
C++提供构造函数来处理对象的初始化。 构造函数是一种特殊的成员函数,不需要用户来调用,定义对象时被自动执行。 构造函数名字与类名相同,无返回类型(void也不能有哦)。
谙忆
2021/01/21
6190
c++模板学习03之普通函数与模板函数区别
普通函数与函数模板的区别 1.普通函数调用可以发生隐式类型转换 #include<iostream> using namespace std; //1.普通函数调用可以发生隐式类型转换 int add(int a, int b) { return a + b; } int main() { int a = 10; int b = 20; char c = 'a'; //a对应的ascall码为97 //将字符c转化为ascall对应的数值与变量a相加 cout << add(a, c) << e
大忽悠爱学习
2021/03/02
4640
c++模板学习03之普通函数与模板函数区别
C++ memset()函数和bzero()函数
memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。
用户7886150
2021/02/16
2.8K0
c++模板学习04之普通函数与模板函数调用规则
普通函数与模板函数调用规则 调用规则如下: 1.如果函数模板和普通函数都可以实现,优先调用普通函数 #include<iostream> using namespace std; //1.如果函数模板和普通函数都可以实现,优先调用普通函数 //普通函数 void func(int a, int b) { cout << "大忽悠到此一游!" << endl; } //模板函数 template<class T> void func(T a, T b) { cout << "大忽悠到此一游!!!" <<
大忽悠爱学习
2021/03/02
1.1K0
c++模板学习04之普通函数与模板函数调用规则
C++ 构造函数和析构函数
在C++的学习中,可以把类当作一个模具,类所实例化出来的对象就是根据这个模具所产生的实体,对象可以看作是我们自己创建的一个新的数据类型。本文主要介绍了类对象通过拷贝函数进行初始化,分析了类对象的内存模型,以及通过this指针来实现更复杂的功能。最后介绍了析构函数的基础知识。
呆呆
2021/07/05
9740
c++——构造函数和析构函数
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情
lovevivi
2022/12/21
5850
c++——构造函数和析构函数
你真的能分清putc()函数和fputc()函数吗?
最近小编在讲关于C语言文件部分内容,讲到了fputc()函数。前面在讲字符串的时候,我们还学习过putc()函数,我们知道,putc()函数一般用于标准输出,fputc()函数一般用于文件读写。刚才呢,有一个童鞋在单字符写文件时,调用了putc()函数,另一个童鞋看到了就说必须要调用fputc()函数,为此,两个童鞋争论起来。那么真相是什么呢?
用户8639654
2021/07/16
7390
你真的能分清putc()函数和fputc()函数吗?
最近小编在讲关于C语言文件部分内容,讲到了fputc()函数。前面在讲字符串的时候,我们还学习过putc()函数,我们知道,putc()函数一般用于标准输出,fputc()函数一般用于文件读写。刚才呢,有一个童鞋在单字符写文件时,调用了putc()函数,另一个童鞋看到了就说必须要调用fputc()函数,为此,两个童鞋争论起来。那么真相是什么呢? 在这里呢,小编就对比着讲解一下这两个函数,看到底能不能调用putc()函数写入单个字符到文件中。
用户8639654
2021/07/16
6140
C#调用C和C++函数的一点区别
最近做U800电话的二次开发,需要调用厂商的C函数库来打电话,后来想加入通话录音功能,但发现程序默认生产的WAV文件过大,又找了个WAV转MP3的C++函数库程序,出了点问题。下面是转MP3的程序接口(头文件): #ifndef _MP3ENC_H_ #define _MP3ENC_H_ int mp3_enc(const char* inWavName,int nRate,const char* outMP3Name); #endif 按照C#调用非托管程序的约定,声明一个对应的C#函数接口: [D
用户1177503
2018/02/26
1.7K0
C语言(C++)中:详解floor函数、ceil函数和round函数
cout << "The floor of 2.2 is " << i << endl;
用户7886150
2021/02/11
4.7K0
普通函数和箭头函数的区别
MDN的描述是箭头函数不会创建自己的this他只会从自己的作用域链的上一层继承this,这里我们可以理解为this指向外层第一个普通函数(如果没有,则指向全局对象(可通过globalThis访问));而普通函数中this指向其调用者。
用户10562852
2023/05/12
3760
普通函数和箭头函数的区别
C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
版权声明:本文为博主-姜兴琪原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxq0816/article/details/82625408
week
2018/09/29
2K0
C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
C++ 定义和调用函数
无参函数定义的一般形式为:     类型标识符 函数名([void])     {         声明部分         语句     } 有参函数定义的一般形式为:     类型标识符 函数名(形式参数表列)     {         声明部分         语句
AIHGF
2019/02/18
8430
构造函数和析构函数可以是虚函数吗,在里面能调用虚函数吗
在内存上,我们知道,一个对象会有一个虚函数表,虚函数表在构造函数中初始化,可是一个对象还没有完成实例化,他的虚函数表是不存在的,一个对象需要调用构造函数完成实例化,这里形成了一个悖论
opencode
2022/12/26
1.6K0
普通函数和箭头函数的区别
箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深…
全栈程序员站长
2022/09/07
8660
【小白学习C++ 教程】六、C++内置函数和函数传参
函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
润森
2022/08/18
9360
【小白学习C++ 教程】六、C++内置函数和函数传参
C++构造函数 | 构造函数
C++在建立一个对象时,常常需要作某些初始化,如果一个数据成员未被赋值,则它的值是不可预知的,因为在系统为它分配内存时,保留了这些存储单元的原状,这就成为了这些数据成员的初始值,在C++中,对象是一个实体,它反映了客观事物的属性,是应该有确定的值的。
小林C语言
2021/01/26
2.2K0
C++构造函数 | 构造函数

相似问题

回调函数与C++中的普通函数

60

C和C++函数指针兼容吗?

31

C++能保证调用某个常量的成员函数吗?

40

c++函数解析选择模板版本而不是普通函数

23

C++什么更快?静态成员函数还是普通成员函数?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文