Являются ли `typedef` и `struct` стандартными функциями в C?

#c #function #scope #typedef #standards

#c #функция #область видимости #typedef #стандарты

Вопрос:

Я использовал некоторый код, подобный этому:

 void A()
{
    typedef struct B B;
    struct B
    {

    };

    B b;
};
  

typedef и struct определение внутри функции. Они компилируются с помощью Clang, но я хочу знать (1), являются ли они частью стандарта или нет. И о (2) ограничены ли они распознаванием только в области видимости функции.

Ответ №1:

Да, стандарт допускает это, и да, имя, которое вы создаете таким образом, видно только внутри функции (т. Е. Оно имеет локальную область видимости, точно так же, как при определении int i; , i имеет локальную область видимости).

Это более распространено, однако делать это примерно так:

 typedef struct { 
    /* ... */ 
} B;
B b;
  

Комментарии:

1. или, если вы действительно собираетесь использовать их только один раз, struct { /* ... */ } b; 🙂

Ответ №2:

Да, это разрешено. но вы не можете иметь
функцию внутри функции.

сначала следует выполнить объявления, а позже вы сможете использовать свой реальный код.

вы не можете объявить после выполнения некоторой операции внутри вашей функции, как показано ниже

 void A()
{

int a=0;

a  ;    

typedef struct B B;//this is wrong
    struct B
    {

    };

    B b;
};
  

Комментарии:

1. C89 требует, чтобы объявления / определения предшествовали другим операторам, но C99 этого не делает.

2. @Vijay не могли бы вы обновить ответ в соответствии с новыми стандартами?