C++:是否可以将 extern "C"函数与普通函数区分开来?

标签 c++

是否可以在编译时区分 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;
}

在 OS X 上使用 gccclang 打印 same

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

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

最佳答案

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

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

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

关于C++:是否可以将 extern "C"函数与普通函数区分开来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45972489/

相关文章:

c++ - 在基本 vector 的元素上调用派生方法(给出的示例)

c++ - 将 vector 并行保存到文件

c++ - 使用 sscanf 提取不带定界符的 float (仅使用预期长度)

c++ - 如何使用 QStringList 显示 QMap 中的所有键?

c++ - 如何判断是否为 PE Win32 启用了 GS 编译器

c++ - 如何初始化和使用静态结构

c++ - 在 C++0x 中,非静态数据成员初始化器会覆盖隐式复制构造函数吗?

C++ 排序 - 普通字母后的特殊字符

c++ - 如何使用法 vector (在 matlab 中)从点云中删除隐藏点?

c++ - 访问 3 索引数组的最快方法