2015-09-28 3 views
1

Я должен начать с того, что я очень новичок в C!Ожидаемое выражение перед «char» в C

Я прошел через Вопросы, которые могут уже иметь ваш ответ и пробовали предложения, однако это не решает сообщение об ошибке, которое я получаю.

Я получаю сообщение об ошибке с кодом ниже:

int autoop_check(aClient *cptr, aClient *sptr, aChannel *chptr, char *parv[]) 
{ 
    if (IsOper(cptr)) 
     char *parv[] = { 
      "+o", 
      sptr->name, 
      NULL 
     }; 
     (void)do_mode(chptr, sptr, sptr, 2, parv, 0, 0); 
} 

Вот сообщение об ошибке:

module.c:32:9: error: expected expression before ‘char’ 
     char *parv[] = { 
     ^
+10

Добавить скобки на ваш, если заявление –

+8

этот код выглядит довольно чрезмерными для кого-то, что является «очень новой для C». откуда это? –

+0

Стандарт требует, чтобы инициализаторы использовали только постоянные выражения. – Olaf

ответ

2

Синтаксис для if утверждения

if (expr) statement 

где statement может быть одно выражения (о функции вызова, арифметическое выражение, и т.д.), выбор другого оператора (if или switch заявления), итерационное заявление (for, while или do-while) или состав, который окружен {}.

Что это такое не может be является декларацией; если вы хотите объявить что-то внутри оператора if, он должен быть частью составного оператора.

Так что происходит в том, что ваш код разбираемый, как

if (IsOper(cptr)) 
     char *parv[] = { 
      "+o", 
      sptr->name, 
      NULL 
     }; 

(void)do_mode(chptr, sptr, sptr, 2, parv, 0, 0); 

То есть, что if заявление содержит только декларацию для parv; к сожалению, декларация не допускается в качестве statement в этом контексте.

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

if (IsOper(cptr)) 
{ 
    char *parv[] = { 
     "+o", 
     sptr->name, 
     NULL 
    }; 

    (void)do_mode(chptr, sptr, sptr, 2, parv, 0, 0); 
} 
3

Вы недостающие скобки для тела if заявления.

if (IsOper(cptr)) { 
     char *parv[] = { 
      "+o", 
      sptr->name, 
      NULL 
     }; 
     (void)do_mode(chptr, sptr, sptr, 2, parv, 0, 0); 
}