$ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin23.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
a.cc
$ cat a.cc
#include<iostream>
using namespace std;
static int x = 5053;
void f2();
int main() {
cout << "a: " << x << endl;
f2();
return 0;
}
b.cc
$ cat b.cc
#include<iostream>
using namespace std;
static int x = 4921;
string f2() {
cout << "b: " << x << endl;
return "";
}
./a.out
$ g++ --std=c++17 a.cc b.cc && ./a.out
a: 5053
b: 4921
为什么我能够将
string f2();
中的 b.cc
转发为 void f2();
中的 a.cc
?这似乎是一个 apple clang bug,因为 main 中的调用
f2()
选择了未定义(未实现)的 void f2()
版本,因此我们应该得到一个链接器错误。
我们确实遇到了 clang 和 gcc 的链接器错误。 演示。所以这似乎是 apple clang 特有的错误。