Статическая встроенная переменная, определенная в заголовке, инициализируется более одного раза.C++

Программы на C++. Форум разработчиков
Anonymous
Статическая встроенная переменная, определенная в заголовке, инициализируется более одного раза.

Сообщение Anonymous »

У меня сложилось впечатление, что статические встроенные переменные инициализируются только один раз:

Код: Выделить всё

// foo.hpp
#pragma once

#include 
#include 

static const inline std::string FOOBAR_DIR = "/foobar_"
+ std::to_string(std::chrono::system_clock::now().time_since_epoch().count()) + "/";
Я думал, что если foo.hpp включен в несколько исходных файлов, оба будут видеть одно и то же значение для FOOBAR_DIR, поскольку инициализация произойдет только один раз. Но в моих тестах Catch2 это, похоже, не так.
В моих тестах Catch2 у меня есть прослушиватель событий, который использует FOOBAR_DIR:

Код: Выделить всё

#include 
#include 

#include 

#include "foo.hpp"

class SomeEventListener: public Catch::EventListenerBase
{
public:
using Catch::EventListenerBase::EventListenerBase;

void testRunStarting(const Catch::TestRunInfo&) override
{
std::filesystem::create_directories(FOOBAR_DIR);
}

void testRunEnded(const Catch::TestRunStats&) override
{
std::filesystem::remove_all(FOOBAR_DIR);
}
};

CATCH_REGISTER_LISTENER(SomeEventListener)

Кроме того, я использую FOOBAR_DIR в другом исходном файле, в тестовом примере:

Код: Выделить всё

#include 

#include "foo.hpp"

TEST_CASE("some test case", "[some-tag]")
{
// Do something with FOOBAR_DIR
}

Проблема в том, что FOOBAR_DIR инициируется дважды, по одному разу для каждого исходного файла, который его использует.
Что-то я делаю неправильно, что приводит к такому поведению? Должны ли статические встроенные переменные инициироваться несколько раз, если к ним обращаются в нескольких исходных файлах?
Я использую GCC 14 в Linux AMD64

Подробнее здесь: https://stackoverflow.com/questions/798 ... -than-once

Вернуться в «C++»