编译时是否可以在C++中区分extern "C"
函数和非[extern "C"
]函数?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;
}
打印same
与gcc
和clang
在OS X
% g++ --std=c++11 externcsame.cpp && ./a.out
same
% clang++ --std=c++11 externcsame.cpp && ./a.out
same
可能在您的系统上它们具有相同的调用约定? –
@VladimirBerezkin我不认为这是依赖于系统的。我问的是扩展模板时发生的行为......这是在系统相关的东西真正有机会影响结果之前发生的。 –
更准确地说,问题是您是否可以拥有一个指向调用约定的函数的指针,而不是通过指针调用时使用的指针,而不用强制转换以获取此类指针?不,并且在实践中,默认情况下调用约定是相同的,对于所有现存的编译器,这个问题是相当有限的。 –