Как инициализировать структуру в соответствии со стандартами языка программирования C - PullRequest
414 голосов
/ 01 декабря 2008

Я хочу инициализировать элемент структуры, разделить в объявлении и инициализации. Вот что у меня есть:

typedef struct MY_TYPE {
  bool flag;
  short int value;
  double stuff;
} MY_TYPE;

void function(void) {
  MY_TYPE a;
  ...
  a = { true, 15, 0.123 }
}

Является ли это способом объявления и инициализации локальной переменной MY_TYPE в соответствии со стандартами языка программирования C (C89, C90, C99, C11 и т. Д.)? Или есть что-нибудь лучше или хотя бы работает?

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

Ответы [ 14 ]

1 голос
/ 12 мая 2016

Мне не понравился ни один из этих ответов, поэтому я сделал свой собственный. Я не знаю, является ли это ANSI C или нет, это просто GCC 4.2.1 в режиме по умолчанию. Я никогда не могу вспомнить скобки, поэтому я начинаю с подмножества моих данных и сражаюсь с сообщениями об ошибках компилятора, пока они не закроются. Читаемость - мой главный приоритет.

    // in a header:
    typedef unsigned char uchar;

    struct fields {
      uchar num;
      uchar lbl[35];
    };

    // in an actual c file (I have 2 in this case)
    struct fields labels[] = {
      {0,"Package"},
      {1,"Version"},
      {2,"Apport"},
      {3,"Architecture"},
      {4,"Bugs"},
      {5,"Description-md5"},
      {6,"Essential"},
      {7,"Filename"},
      {8,"Ghc-Package"},
      {9,"Gstreamer-Version"},
      {10,"Homepage"},
      {11,"Installed-Size"},
      {12,"MD5sum"},
      {13,"Maintainer"},
      {14,"Modaliases"},
      {15,"Multi-Arch"},
      {16,"Npp-Description"},
      {17,"Npp-File"},
      {18,"Npp-Name"},
      {19,"Origin"}
    };

Данные могут начинать жизнь как файл с разделителями табуляцией, который вы ищете - заменяете, чтобы преобразовать во что-то еще. Да, это вещи Debian. Итак, одна внешняя пара {} (с указанием массива), затем другая пара для каждой структуры внутри. С запятыми между. Помещать вещи в заголовок не обязательно, но у меня в структуре около 50 элементов, поэтому я хочу, чтобы они были в отдельном файле, чтобы не допустить путаницы в моем коде, и поэтому их легче заменить.

0 голосов
/ 02 декабря 2018

Я искал хороший способ инициализации моей структуры, и мне пришлось использовать нижеприведенное (C99). Это позволяет мне инициализировать либо одну структуру, либо массив структур так же, как обычные типы.

typedef struct {
    char *str;
    size_t len;
    jsmntok_t *tok;
    int tsz;
} jsmn_ts;

#define jsmn_ts_default (jsmn_ts){NULL, 0, NULL, 0}

Это можно использовать в коде как:

jsmn_ts mydata = jsmn_ts_default; /* initialization of a single struct */

jsmn_ts myarray[10] = {jsmn_ts_default, jsmn_ts_default}; /* initialization of
                                                    first 2 structs in the array */
0 голосов
/ 12 августа 2018

Я прочитал документацию для Microsoft Visual Studio 2015 по инициализации типов агрегатов , но все формы инициализации с помощью {...} описаны там, но инициализация с точкой с именем '' указатель '' isn ' там упоминается. Это не работает также.

Стандарт C99, глава 6.7.8. Инициализация объясняет возможность указателей, но, на мой взгляд, она не совсем понятна для сложных структур. Стандарт C99 в формате pdf .

На мой взгляд, может быть лучше

  1. Использовать = {0}; -нициализацию для всех статических данных. Это меньше усилий для машинного кода.
  2. Используйте макросы для инициализации, например

    typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}

Макрос может быть адаптирован, его список аргументов может быть независимым от измененного содержимого структуры. Это правильно, если нужно инициализировать меньше элементов. Это также подходит для вложенной структуры. 3. Простая форма: Инициализация в подпрограмме:

void init_MyStruct(MyStruct* thiz, int a, int b) {
  thiz->a = a; thiz->b = b; }

Эта подпрограмма выглядит как ObjectOriented в C. Используйте thiz, а не this для компиляции с C ++ тоже!

MyStruct data = {0}; //all is zero!
init_MyStruct(&data, 3, 456);
0 голосов
/ 06 сентября 2017

Структура в C может быть объявлена ​​и инициализирована следующим образом:

typedef struct book
{
    char title[10];
    char author[10];
    float price;
} book;

int main() {
    book b1={"DS", "Ajay", 250.0};

    printf("%s \t %s \t %f", b1.title, b1.author, b1.price);

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