c++ - 构造函数符号过多

标签 c++

编译时,这个:

template <typename T>
struct ConstArray {
///MEMBERS
    T* data_;
    T* end_;

///Constructors
    ConstArray(T* data, T* end) : data_(data), end_(end) {}
};

template struct ConstArray<const char>;

给我(nm -C *.o):

0000000000000000 W ConstArray<char const>::ConstArray(char const*, char const*)
0000000000000000 W ConstArray<char const>::ConstArray(char const*, char const*)
0000000000000000 n ConstArray<char const>::ConstArray(char const*, char const*)

对于我定义的每个构造函数,我似乎得到了三个符号(2 W + 1 n(不知道那是什么))。函数似乎只给我预期的一个。 有人可以解释这是为什么还是给我一个解释?

最佳答案

也许我能明白为什么这个符号出现在 nm 输出中,但我不知道它是否应该/不应该在那里以及 n 到底是什么意思。也许如果有人熟悉这一点,他可以发布完整的答案。

如果你执行 objdump -t ./obj.o 你可以看到一个符号表。除了 2 个构造函数和我看到的许多其他符号

00000000 l       .group 00000000 _ZN10ConstArrayIKcEC5EPS0_S2_

那里。该标志只有 l,这意味着它是本地的而不是调试的,所以我在 nm 输出中看到它作为第三个符号。

如果我执行 nm -g ./obj.o 只看到外部符号,我只会看到 2 个 W 构造函数,而当我执行 nm -a ./obj.o 我看到了所有符号,并且还在 objdump -x 中标记为 debug。我还看到一些调试符号在 nm -a 输出中标记为 n

所以我不知道n 是什么意思,但是第三个符号在某种程度上与elf 文件的.group 部分相关。它负责将符号组合在一起。

关于c++ - 构造函数符号过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738305/

相关文章:

C++11,使用 vs typedef,模板化

c++ - 为什么我可以将 int 和 BOOL 强制转换为 void*,但不能 float ?

c++ - 什么时候使用以及c++中clog和cerr的区别

c++ - 读取特定行中的值(可变数量的值)并将它们存储在数组中

c++ - 什么是好的网格动画技术?

C++ 指针对象位置

c++ - Qt - 无法找到或加载平台插件 "windows"- 但它就在那里! - 动态构建

c++ - 重载 << 以输出 map 的 key_type 和 mapped_type

c++ - 参数顺序评估

c++ - 为什么 ranges::split_view 不是双向范围?