2014-02-06 3 views
8
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

int main() 
{ 
    struct emp 
    { 
     struct address 
     { 
       int a; 
     }; 
     struct address a1; 
    }; 
} 

Этот код показывает предупреждение: -ничего не объявляет: предупреждение?

предупреждение: декларация ничего (по умолчанию включено) не объявлять

Где, как следующий код не показывает предупреждение

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

int main() 
{ 
    struct emp 
    { 
     struct address 
     { 
      int a; 
     }a1; 
    }; 
} 

Почему «Предупреждение» отображается только в первом коде?

+0

Может ли вы отправить PLUS свои заявления включения и макросы, если вы использовали их? – arunb2w

+0

@ arunb2w: см. Править –

+0

Является ли ваша структура пустой, как вы показали? – rullof

ответ

8

Причина, почему компилятор показывает предупреждение, потому что он не видит имя переменной типа address вы определили для emp структуры, даже если вы сделать объявить что-то с помощью address на следующей строке, но я думаю, что компилятор недостаточно умен, чтобы понять это.

Как вы показали, это производит предупреждение:

struct emp { 
    struct address {}; // This statement doesn't declare any variable for the emp struct. 
    struct address a1; 
}; 

Но не так:

struct emp { 
    struct address {} a1; // This statement defines the address struct and the a1 variable. 
}; 

Или это:

struct address {}; 

struct emp { 
    struct address a1; //the only statement declare a variable of type struct address 
}; 

struct emp {} не показывает каких-либо предупреждений с момента этот оператор не находится внутри блока детекции структуры. Если вы положили его внутри одного из них, тогда компилятор также покажет предупреждение. Ниже будут показаны два предупреждения:

struct emp { 
    struct phone {}; 
    struct name {}; 
}; 
3

Синтаксис определения структуры:

struct identifier { 
    type member_name; 

    // ... 

}; 

Если добавить идентификатор только после закрывающей фигурной скобкой, вы объявить переменную, которая определена структура.

В вашем первом примере компилятор рассматривает структуру address как тип члена. это как если вы пишете:

struct identifier { 

    type ; // No member name is specified 
    type a1; 

    // ... 

} 

Но во втором примере вы указали имя элемента:

struct identifier { 

    type a1; // Member name specified 

    // ... 

} 

А вот пример предупреждения: http://ideone.com/KrnYiE.

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