2014-06-02 3 views
1

У меня есть .c файл, который я пытаюсь скомпилировать в VS2012, но я получаю эту ошибку:C2059 в VS2012: Как инициализировать экземпляр структуры?

error C2059: syntax error : '.' main.c 

Согласно тому, что я прочитал это конкретная проблема с VS2012 компилятора, который я выиграл» t работать с другими компиляторами. Независимо от того, действительно ли это, я надеюсь, что кто-то здесь может сказать мне, как исправить эту ошибку компилятора. Как изменить код так, чтобы компилировать код и поведение было одинаковым?

Это то, что у меня в файле заголовка:

struct mystruct 
{ 
    struct someOtherStruct obj2; 
    void* ptr1; 
    void* ptr2; 
    void* ptr3; 
}; 

И это то, что я имею в main.c

void* P1 = NULL; 
void* P2 = NULL; 
void* P3 = NULL; 

/* VS2012 complains about this syntax */ 
static struct mystruct obj = 
{ 
.ptr1 = P1, 
.ptr2 = P2, 
.ptr3 = P3, 
}; 


void main(void) 
{ 
    /* Empty for now */ 
} 
+0

с использованием имен элементов при инициализации struct является особенностью «последней» версии C. Кажется, компилятор C немного отстает от времени, поскольку он не распознает последний синтаксис, поэтому используйте старый синтаксис, как показано @Praetorian. Более старый синтаксис по-прежнему поддерживается всеми компиляторами C. – user3629249

ответ

1

VS2013 (окончательно) supports назначенные инициализаторы, поэтому вам нужно обновить свой компилятор, чтобы получить эту функцию. В противном случае перепишите свой инициализатор так, чтобы он соответствовал C89.

static struct mystruct obj = 
{ 
    { /* initialize someOtherStruct members here */ }, 
    P1, /* drop the member names */ 
    P2, 
    P3, 
}; 

Если вы не хотите заморачиваться с написанием инициализаторы для someOtherStruct, изменить порядок членов mystruct так, что компилятор автоматически нулевой инициализации obj2:

struct mystruct 
{ 
    void* ptr1; 
    void* ptr2; 
    void* ptr3; 
    struct someOtherStruct obj2; 
}; 

static struct mystruct obj = 
{ 
    P1, 
    P2, 
    P3, 
}; 
1

Designated initializers являются C99 (или новее) функция, и визуальный Studio не поддерживает C99 (или новее). Эквивалент VS-совместимые инициализации будут выглядеть так:

static struct mystruct obj = 
{ 
    { 0 }, 
    P1, 
    P2, 
    P3 
}; 

Оба Clang/LLVM и GCC поддержка C11 и доступны для Windows, если вы предпочитаете, чтобы сохранить тот же код.

+1

В основном я написал тот же ответ, что и вы, а затем нашел [это] (http://www.infoq.com/news/2013/07/vs2013_CPP_compliance). VS2013 поддерживает назначенные инициализаторы. И ссылку [MSDN] (http://msdn.microsoft.com/en-us/library/hh409293.aspx) о том же. – Praetorian

+0

Добро пожаловать в будущее, я думаю ... ;-) –

Смежные вопросы