在编译时可以区分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上用gcc
和clang
打印gcc
和clang
。
% g++ --std=c++11 externcsame.cpp && ./a.out
same
% clang++ --std=c++11 externcsame.cpp && ./a.out
same
发布于 2017-08-31 04:39:03
C链接函数和C++链接函数有不同的类型,即使它们采用相同的参数类型并返回相同的类型。(嗯,听起来很熟悉)。但是大多数编译器并不强制执行这个规则,而是将它们视为相同的类型。(嗯,听起来很熟悉)。
例如,C++标准指定std::qsort
具有两个重载,一个以C链接函数作为比较函数,另一个以带有C++链接的函数作为比较函数。这只是简单的重载,当您使用任何函数类型调用std::qsort
时,编译器应该选择适当的重载。
所以,是的,std::is_same
应该是区分这两种类型所需要的全部。但是,同样,大多数编译器并不将它们视为不同的类型。如果您有其中一个编译器(几乎可以肯定),那么它们的类型是相同的,您无法区分它们。因此,例如,这些编译器的标准库只有一个版本的std::qsort
。
https://stackoverflow.com/questions/45972489
复制相似问题