我用 g++ 和 clang++ 编译这个程序。有一个区别:
g++ 打印 1,但 clang++ 打印 2。
似乎
g++: extern 变量定义在最短范围内。
clang++:extern 变量定义在最短的全局范围内。
C++ 规范对此有任何规范吗?
主程序
#include <iostream>
static int i;
static int *p = &i;
int main() {
int i;
{
extern int i;
i = 1;
*p = 2;
std::cout << i << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
其他.cpp
int i;
Run Code Online (Sandbox Code Playgroud)
版本:g++:7.4.0/clang++:10.0.0
编译:$(CXX) main.cpp other.cpp -o extern.exe
C++ 规范是否指定了in的顺序operator new
和构造函数。
g++ 让顺序为-> -> ,但 clang++ 让它为-> -> 。
差异是由未指定的行为引起的吗?A
new C(A())
A()
new
C()
new
A()
C()
g++:7.4.0 叮当++:10.0.0
#include <iostream>
#include <cstdlib>
struct A {
A() {
std::cout << "call A()\n";
}
};
struct C {
C(A) {
std::cout << "call S()\n";
}
void *operator new(size_t s) {
std::cout << "call new()\n";
return malloc(s);
}
};
int main() {
void *p = new C(A());
}
Run Code Online (Sandbox Code Playgroud) 我想连接text
到dir
. 我用for
下面的代码来完成这项工作。我想知道是否有更简洁的代码来做同样的事情?
for fn in dir/*; do
cat text >> $fn
done
Run Code Online (Sandbox Code Playgroud) 我用g++
(7.3.0)编译了这个 C++ 代码。
struct C {
__attribute__((noinline)) int foo() { return 0; };
};
int bar(C &c) { return c.foo(); }
Run Code Online (Sandbox Code Playgroud)
使用nm
我发现它foo
很弱。这是由于 C++ 规范还是 GCC 的决定?
实验流程:
$ g++ test.cpp -c -Og
$ nm test.o
0000000000000000 T _Z3barR1C
0000000000000000 W _ZN1C3fooEv
Run Code Online (Sandbox Code Playgroud) Clang 和 GCC 在这个问题上有不同的意见:
使用 g++ 打印“result2”,但使用 clang++ 打印“result1”。
我知道g++认为A
抛出的g()
,不一样的A
是main.cpp。
但是,clang++ 有什么问题吗?
版本:
g++:7.4.0
叮当:10.0.0
主.cpp:
#include <iostream>
namespace {
struct A {};
}
extern void g();
int main()
{
try {
try {
g();
} catch (A) {std::cout << "result1\n";}
} catch (...) {std::cout << "result2\n";}
}
Run Code Online (Sandbox Code Playgroud)
其他.cpp:
namespace {
struct A {};
}
void g() { throw A(); }
Run Code Online (Sandbox Code Playgroud) 我用g++编译了这个程序。并打印出“不平等”。
如果我不使用“packed”属性,它会打印“equal”。
我不知道“打包”属性如何导致差异。
顺便说一下,由 clang++ 构建的可执行文件打印“equal”。
#include <iostream>
struct __attribute__ ((packed)) Packed {
char a;
int b;
int c;
char d;
};
void test(const int &i, int *ptr) {
std::cout << ((&i == ptr) ? "equal" : "unequal") << std::endl;
}
int main () {
Packed p;
p.c = 1;
test(p.c, &p.c);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我发现两个相似的语句之间有不同的执行顺序(唯一的区别是下面有一个额外的;
)。析构函数顺序不同。C++ 是否有相应的规范,或者它只是一种未指定的行为?
环境:GCC10
#include <iostream>
template <int num>
struct S {
S() {std::cout << "S(" << num << ")\n"; }
~S() {std::cout << "~S(" << num << ")\n"; }
};
int main() {
({S<1>(), S<2>();});
std::cout << "-----------------------------------\n";
({S<3>(), S<4>();;});
}
Run Code Online (Sandbox Code Playgroud)
输出:
S(1)
S(2)
~S(1)
~S(2)
-----------------------------------
S(3)
S(4)
~S(4)
~S(3)
Run Code Online (Sandbox Code Playgroud) 我用 g++ 和 clang++ 编译了这个程序。
G++ 可执行文件打印一个“触发 A 副本分配”。
Clang++ 可执行文件打印两个“触发器 A 副本分配”并出现分段错误。
有没有畸形?还是只是clang的问题?
版本:gcc-7.4.0/clang-10.0.0
#include <iostream>
struct A {
A &operator =(const A &other) {
std::cout << "trigger A copy assignment\n";
}
};
int main() {
A x,y;
y = x;
}
Run Code Online (Sandbox Code Playgroud)