今天份的 #bug小熊手 。
我们知道在C++代码中可以通过 extern "C" 来指定一段代码使用C连接性,即像C那样不把函数参数编码到符号中,而是直接按照函数名称来产生对应的符号。extern "C"可以是一个以 {} 为边界的语句块,从常理来看,出了这个语句块之后的连接性应该恢复C++,即定义同名但参数不同的函数时,编译器会按照C++的风格将参数编码到符号中,而不是报错告诉用户说定义了重名的C函数,事实上 LLVM/clang 正是如此处理的。
GCC 11对此似有不同意见。解决方法是强行指定 extern "C++”。这个点了明天还要上班,实在是不想拆编译器玩,先这样吧。
我们知道在C++代码中可以通过 extern "C" 来指定一段代码使用C连接性,即像C那样不把函数参数编码到符号中,而是直接按照函数名称来产生对应的符号。extern "C"可以是一个以 {} 为边界的语句块,从常理来看,出了这个语句块之后的连接性应该恢复C++,即定义同名但参数不同的函数时,编译器会按照C++的风格将参数编码到符号中,而不是报错告诉用户说定义了重名的C函数,事实上 LLVM/clang 正是如此处理的。
GCC 11对此似有不同意见。解决方法是强行指定 extern "C++”。这个点了明天还要上班,实在是不想拆编译器玩,先这样吧。