Инициализировать структуру в C ++ C - PullRequest
1 голос
/ 19 апреля 2020

Я инициализирую структуру stati c в C таким образом, но в C ++ она не хочет компилироваться. Как мне получить эквивалент в C ++, который все еще будет совместим с C? (linux C код, который я пытаюсь скомпилировать на MSV C)

typedef struct float3 {
    float x,y,z;
} float3;

void main() {
    static float3 value = (float3){ 1.f, 5.f, 10.f };
}

MSV C (Visual Studio 2019) выдает ошибку в открывающей скобке '{' после ( float3).

Error (active)  E0029   expected an expression  cpptestvs   D:\Projects\cpptestvs\cpptestvs\cpptestvs.cpp   11  

Ответы [ 2 ]

1 голос
/ 19 апреля 2020
static float3 value = (float3){ 1.f, 5.f, 10.f };

Это составной литерал , который разрешен в C, но не в C ++. C позволяет вам создать безымянный объект типа float3 и инициализировать его списком инициализаторов. Некоторые компиляторы, такие как G CC, поддерживают его как расширение, но MSV C не поддерживает.

Чтобы делать то, что вы хотите, вы можете сделать:

static float3 value = { 1.f, 5.f, 10.f };

This is агрегатная инициализация : каждый нестатический c член класса в структуре float3 инициализируется копией из соответствующего предложения списка инициализаторов. Ваша структура является агрегатом, потому что она не имеет ни объявленных пользователем конструкторов, ни закрытых или защищенных нестатических c членов данных, ни базовых классов, ни виртуальных функций.

1 голос
/ 19 апреля 2020

Попробуйте удалить приведение к float3 в операторе, заключенном в void main().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...