C++:是否可以区分外部"C"函数和普通函数?
C++: Is it possible to distinguish an extern "C" function from an ordinary function?
是否可以在编译时区分C 中的extern "C"
函数和非 - [extern "C"
]函数?
它们的行为截然不同,显然允许具有不同的呼叫约定(请参阅https://stackoverflow.com/a/45968482/931154)。
以下代码段表明,不可能使用编译时可用的信息来区分它们。
#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;
}
用gcc
打印same
,在OS X上打印clang
。
% g++ --std=c++11 externcsame.cpp && ./a.out
same
% clang++ --std=c++11 externcsame.cpp && ./a.out
same
具有C链接的功能,并且具有C 链接的功能具有不同的类型,即使它们采用相同的参数类型并返回相同的类型。(嗯,听起来很熟悉)。但是,大多数编译器都不执行此规则,并将其视为相同的类型。(嗯,听起来很熟悉)。
因此,例如,C 标准指定std::qsort
具有两个 Overloads,一个将C链接作为比较函数,并且具有C 链接的函数作为比较功能功能。这只是普通的过载,当您使用任何一个功能类型调用std::qsort
时,编译器都应该选择适当的过载。
因此,是的,std::is_same
应该是区分两种类型所需的全部。但是,同样,大多数编译器不会将它们视为不同类型。如果您有其中一个编译器(几乎可以肯定的是),那么它们具有相同的类型,并且您无法分辨它们。因此,例如,这些编译器的标准库仅具有一个 std::qsort
的版本。
相关文章:
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- C++:函数外部的超时功能
- 如何在函数外部访问函数中局部变量的值?
- 在成员函数外部封闭类的定义中需要默认成员初始值设定项
- 以延长构造函数外部 QT 对象的生存期
- 全局静态变量不"staying defined"函数外部
- C++ 函数外部丢失的指针对象
- 向量大小在构造函数外部恢复为 0
- 删除函数外部的实例化对象
- 在函数外部编写代码
- 为什么我不能添加到方法/函数外部的 ostringstream
- 用于在方法或函数外部声明的变量的内存
- SDL2 在函数外部加载字体会引发错误
- 如何在具有多态性的函数外部创建对象
- 在函数外部声明对象,将其作为引用传递,然后在函数内部创建它
- 向量未在函数C++外部更新
- 访问函数外部的堆栈对象
- 在c++中访问函数外部的数组
- 如何更新函数外部的数组(指向指针)