小编edd*_*kuo的帖子

C++ 编译器如何找到一个 extern 变量?

我用 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++ language-lawyer c++17

16
推荐指数
1
解决办法
366
查看次数

operator new 的执行顺序和构造函数的参数

C++ 规范是否指定了in的顺序operator new和构造函数。 g++ 让顺序为-> -> ,但 clang++ 让它为-> -> 。 差异是由未指定的行为引起的吗?Anew C(A())
A()newC()newA()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)

c++ language-lawyer order-of-execution c++17

9
推荐指数
1
解决办法
545
查看次数

如何将一个文件连接到多个文件?

我想连接textdir. 我用for下面的代码来完成这项工作。我想知道是否有更简洁的代码来做同样的事情?

for fn in dir/*; do
  cat text >> $fn
done
Run Code Online (Sandbox Code Playgroud)

bash file

6
推荐指数
1
解决办法
67
查看次数

为什么成员函数的符号很弱?

我用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)

c++ gcc symbols

5
推荐指数
1
解决办法
129
查看次数

不同 C++ 文件中未命名命名空间中的名称可以指代同一个命名的东西吗?

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)

c++ language-lawyer c++17

3
推荐指数
1
解决办法
111
查看次数

打包成员的引用地址不等于打包成员的地址?

我用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++

2
推荐指数
1
解决办法
1万
查看次数

GCC 语句表达式中的执行顺序

我发现两个相似的语句之间有不同的执行顺序(唯一的区别是下面有一个额外的;)。析构函数顺序不同。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)

c++ gcc gcc-statement-expression

2
推荐指数
1
解决办法
74
查看次数

由重新定义的运算符“=”引起的分段错误

我用 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)

c++ c++17

0
推荐指数
1
解决办法
101
查看次数