Инициализация статической структуры с тегами в C++
Я искал stackru для ответа, но я не могу получить что-то релевантное.
Я пытаюсь инициализировать экземпляр статической структуры с начальными значениями, указав их теги, но я получаю ошибку во время компиляции:
src/version.cpp:10: error: expected primary-expression before ‘.’ token
Вот код:
// h
typedef struct
{
int lots_of_ints;
/* ... lots of other members */
const char *build_date;
const char *build_version;
} infos;
И неисправный код:
// C
static const char *version_date = VERSION_DATE;
static const char *version_rev = VERSION_REVISION;
static const infos s_infos =
{
.build_date = version_date, // why is this wrong? it works in C!
.build_version = version_rev
};
const infos *get_info()
{
return &s_infos;
}
Таким образом, основная идея состоит в том, чтобы обойти инициализацию "других членов" и установить только соответствующие build_date
а также build_version
ценности. Раньше это работало в C, но я не могу понять, почему это не будет работать в C++.
Есть идеи?
редактировать:
Я понимаю, что этот код выглядит как простой C, и это действительно так. Весь проект написан на C++, поэтому я должен использовать расширения файлов C++, чтобы предотвратить беспорядок зависимости makefile (%.o: %.cpp
)
4 ответа
Используемая вами функция - это функция C99, и вы используете компилятор C++, который ее не поддерживает. Помните, что, хотя код C обычно является допустимым кодом C++, код C99 не всегда.
В следующем примере кода определяется структура, которую я считаю более подходящей для C++ (нет необходимости в typedef), и используется конструктор для решения вашей проблемы:
#include <iostream>
#define VERSION_DATE "TODAY"
#define VERSION_REVISION "0.0.1a"
struct infos {
int lots_of_ints;
/* ... lots of other members */
const char *build_date;
const char *build_version;
infos() :
build_date(VERSION_DATE),
build_version(VERSION_REVISION)
{}
};
static const infos s_infos;
const infos *get_info()
{
return &s_infos;
}
int main() {
std::cout << get_info()->build_date << std::endl;
std::cout << get_info()->build_version << std::endl;
return 0;
}
Я считаю, что это было добавлено как функция в C99, но никогда не было стандартной функцией в C++.
Тем не менее, некоторые компиляторы, вероятно, предлагают его как нестандартное расширение языка.
Я вижу, что теперь это часть стандарта CPP 20. Это называется Назначенные инициализаторы .
T object = { .des1 = arg1 , .des2 { arg2 } ... }; (3) (since C++20)
T object { .des1 = arg1 , .des2 { arg2 } ... }; (4) (since C++20)