2012-06-25 5 views
1

Я использую только C99, и, вчера, я слышал, что это было невозможно смешать несколько деклараций и инициализацию в ANSI C. Таким образом, коды, как это:Можно ли смешивать несколько деклараций/инициализаций?

unsigned x = 42, y = 21; 
double e = 3.14; 

бы быть, с помощью GCC»-pedantic флага:

unsigned x, y; 
double e; 

x = 42, y = 21; 
e = 3.14; 

Я удивлен, потому что я не нашел никакой информации о том, что в проекте C89, и код, как это работает отлично ...

unsigned x = 42, y = 21; 
double e = 3.14; 

Извините, это кажется тривиальным вопросом, но я провел некоторое исследование, и мне ничего не сказали об этом правиле ... Это правда?

+0

У меня нет ошибки из 'c99 -Wall -pedantic'. –

+0

Я тоже. Но он сказал мне, что с -анси-педантичными-педантическими ошибками у него были некоторые ошибки. –

+0

@ Lucas Pesenti Кто вам сказал? – nos

ответ

4

Инициализация является частью декларации, так что вы можете сделать инициализацию в объявлении в обоих C89/C99:

/* Valid in C89 and C99. There are no statement, only declarations */ 
unsigned x = 42, y = 21; 
double e = 3.14; 

То, что вы не можете сделать, это смешивать заявления и декларации в C89:

/* Not valid in C89, valid in C99: mixing declarations and statements */ 
unsigned x, y; 
x = 42, y = 21; 

double e; 
e = 3.14; 
+0

Хорошо, так что это кажется действительным. Спасибо, я об этом подумаю. –

0

На самом деле, я использую ваш первый синтаксис с флагом -pedantic, и он работает хорошо, без предупреждения. Насколько я знаю, вы не можете смешивать свой код так:

int i; 
i = 2; 
int j; 
j = 2; 

Это потому, что в С семантической, каждая программа представляет собой блок и блок является пара [деклараций, команды]. Но объявление включает инициализацию переменных.

Каждый раз, когда вы открываете новый блок, например, с помощью while или if, у вас будет второй блок, и снова вы можете иметь часть декларации и команду.

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