Статическая встроенная переменная, определенная в заголовке, инициализируется более одного раза.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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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