Инициализация статической структуры с тегами в C ++ - PullRequest
6 голосов
/ 26 апреля 2011

Я искал stackoverflow для ответа, но не могу найти что-то релевантное.

Я пытаюсь инициализировать экземпляр статической структуры с начальными значениями, указав их теги, но я получаю ошибку во время компиляции:

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 ++.

Есть идеи?

edit :

Я понимаю, что этот код выглядит как простой C, и это действительно так.Весь проект написан на C ++, поэтому я должен использовать расширения файлов C ++, чтобы предотвратить беспорядок зависимости make-файла (%.o: %.cpp)

Ответы [ 3 ]

7 голосов
/ 26 апреля 2011

Используемая вами функция - это функция C99, и вы используете компилятор C ++, который ее не поддерживает. Помните, что, хотя код C обычно является допустимым кодом C ++, код C99 не всегда.

5 голосов
/ 26 апреля 2011

В следующем примере кода определяется структура, которую я считаю более подходящей для 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;
}
4 голосов
/ 26 апреля 2011

Я считаю, что это было добавлено как функция в C99, но никогда не было стандартной функцией в C ++.

Однако некоторые компиляторы, вероятно, предлагают его как расширение нестандартного языка.

...