c++ - 跨 C++ 翻译单元的初始化

标签 c++ gcc g++

或者我有两个文件,每个文件都有一个全局初始化。一者依赖于另一者。

简化示例:

文件1.h:

#include <string>
extern const std::string PREFIX;

文件1.cpp:

#include "file1.h"
const std::string PREFIX  = "prefix,";

文件2.cpp:

#include "file1.h"
std::string MSG = PREFIX + "body";
int main(){}

我这样编译它们:

/usr/local/bin/g++-4.6.2 -c -Wall -g -o file1.o file1.cpp
/usr/local/bin/g++-4.6.2 -c -Wall -g -o file2.o file2.cpp
/usr/local/bin/g++-4.6.2 -Wall -g  -o example file1.o file2.o

当我运行它时,它出现段错误。 gdb 跟踪:

Starting program: example

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b7ae0b in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) ()
  from /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/libstdc++.so.6 
(gdb) bt
#0  0x00007ffff7b7ae0b in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) ()
   from /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/libstdc++.so.6
#1  0x00000000004009b5 in std::operator+<char, std::char_traits<char>, std::allocator<char> > (__lhs=Traceback (most recent call last):
   File "/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/../../../../share/gcc-4.6.2/python/libstdcxx/v6/printers.py", line 587, in to_string
     return ptr.lazy_string (length = len)
RuntimeError: Cannot access memory at address 0xffffffffffffffe8
, __rhs=0x400af0 "body") at /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/include/c++/bits/basic_string.h:2346
#2  0x000000000040095f in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at file2.cpp:3
#3  0x000000000040098b in _GLOBAL__sub_I_MSG () at file2.cpp:6
#4  0x0000000000400ab6 in __do_global_ctors_aux ()
#5  0x00000000004006e3 in _init ()
#6  0x00007ffff7ffa5a0 in ?? ()
#7  0x0000000000400a45 in __libc_csu_init ()
#8  0x00007ffff72dcbe0 in __libc_start_main () from /lib/libc.so.6
#9  0x00000000004007c9 in _start ()

有没有办法做我想做的事情(记住这是一个过于简化的例子)?或者我是否受到编译器/链接器选择的初始化顺序的支配?

最佳答案

您需要使前缀字符串位于其他字符串之前。一种方法是将其更改为 C 字符串

// header
#include <string>
extern const char * const PREFIX;

// .cpp file
const char * const PREFIX = "prefix,";

另一种方法是从函数返回前缀,并在之前使用 PREFIX 的位置使用 PREFIX()

// header
inline const string& PREFIX() { 
  static const string value = "prefix,";
  return value;
}

最后,只是一个提示:全部大写字母的名称仅在大多数编码约定中用于宏,因此我会避免为变量和函数使用此类名称。

关于c++ - 跨 C++ 翻译单元的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11460473/

相关文章:

c++ - Pig Latin - 字符串

C++ 函数错误——无法将大括号括起来的初始值设定项列表转换为 char*

c++ - 使用带有参数包扩展和附加值的静态存储持续时间初始化 std::array

c++ - 在嵌套 Lambda 中使用 `decltype` 时出现 GCC 段错误

c++ - LookAt(glm)返回错误的转换z值

C++ TlHelp32.h 不工作?

c - 单个变量是否存在编译器内存屏障?

c++ - 无法使用 gdb 在文件中创建断点

c++ - 非捕获通用 lambda 应该衰减为函数指针吗?

c - 为什么 gcc 从不存在的文件夹中搜索头文件?