Ошибка компиляции в функции с использованием токенов в C - PullRequest
0 голосов
/ 30 марта 2020

Я определил структуру и создал инициализацию этой структуры в функции, но я всегда получаю ошибку без причины.

Структура:

typedef struct order 
{
   int ident_o;
   product set_prod[MAX_PRODS_OD]; /* Set of products */
   int state;
}order;

Функция:

order make_order(product s[])
{
    order p1;
    product empty_prod = {0,"",0,0,0,0};
    int i = 0;
    while (i<MAX_PRODS_OD)
    {
        s[i] = empty_prod;
        i++;
    }
    p1 = {0,s,0};   /* creates a product and returns the created product*/
    p1.ident_o = y;
    /*p1.set_prod = *s; */
    return p1;
}

Я могу скомпилировать только с помощью этой команды "g cc -Wall -Wextra -Werror -ansi -pedanti c"

, и я всегда получаю эту ошибку:

error: expected expression before ‘{’ token
     p1 = "{"0,s,0};   /* creates a product and returns the created product*/

Я не понимаю, почему он указывает на этот токен между этими кавычками. Код правильный, верно?

1 Ответ

1 голос
/ 30 марта 2020

Списки инициализаторов могут использоваться только во время инициализации, которая может происходить только при определении объекта. Единственный способ напрямую назначить каждый член типа структуры - это присвоение из выражения типа, совместимого с этим типом структуры. Вы можете сделать это, присваивая непосредственно другому объекту этого типа структуры (или объекту по указателю этого типа структуры), или используя составной литерал. Вот некоторый код, который демонстрирует то, о чем я говорю.

#include <stdio.h>

int main(void) {
    struct foo {
        int a;
        int b;
    };
    struct foo foobar = { 0, 5}; // initialization
    struct foo barbaz = { 1, 3};
    struct foo *qwop;
    printf("%d %d\n", foobar.a, foobar.b);

    foobar = barbaz; // assigning from a struct of compatible type
    printf("%d %d\n", foobar.a, foobar.b);

    foobar = (struct foo){24, 99}; // assigning from compound literal
    printf("%d %d\n", foobar.a, foobar.b);

    qwop = &barbaz;
    foobar = *qwop; // assigning from a pointer of struct of compatible type
    printf("%d %d\n", foobar.a, foobar.b);
    return 0;
}

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

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