Почему CodeBlocks выделяет класс ключевого слова и компилирует его без каких-либо ошибок (я программирую на C)? - PullRequest
0 голосов
/ 08 июля 2019

Я пытался создать класс в c, после просмотра некоторого учебного пособия.

Я видел видео о классах и объектах на YouTube, код был на Java, но инструктор сказал, что он одинаков и для других языков.Я выучил немного базового языка Си.Когда я открыл Code :: Blocks и набрал «class», он выделился, а затем скомпилировал его без ошибок.Я знаю, что C не является языком ООП, поэтому он не должен содержать классов.И да, файл был .c файл.

 #include"stdio.h"
  void main(void)
  {
         int sa[5];
         printf("Size : %ld\n",sizeof(sa));
  }
  class;

Нет ошибок при компиляции, но есть предупреждение

warning: data definition has no type or storage class
warning: type defaults to ‘int’ in declaration of ‘class’ [-Wimplicit-int]|
||=== Build finished: 0 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Я видел видео на классах и объектах на YouTube, код был в Java но инструктор сказал, что то же самое относится и к другим языкам.

Это было несколько безответственно с инструктором. Некоторые другие языки имеют синтаксис , похожий на Java для определения классов - прежде всего, C ++. С другой стороны, некоторые другие ОО-языки имеют совершенно разные синтаксисы, а некоторые даже не используют термин «класс», тем более ключевое слово с таким написанием.

Я выучил немного базового языка Си. Когда я открыл Code :: Blocks и набрал «class», он выделил

«класс» не является ключевым словом C, поэтому выделять его как единое в коде C контрпродуктивно. Если это то, что делает Code :: Blocks (для файла .c), то это будет недостатком. Но если оно выделяло это слово как идентификатор (имя переменной), оно действовало разумно.

и затем я скомпилировал его без ошибок.

... но с некоторыми предупреждениями , о которых вы упомянули только позже:

предупреждение: определение данных не имеет типа или класса хранения
предупреждение: тип по умолчанию равен "int" в объявлении "class" [-Wimplicit-int]

Они говорят вам, что ваш код интерпретируется иначе, чем вы, вероятно, ожидали.

Два связаны. Они говорят вам, что «класс» обрабатывается как как идентификатор (переменной), а не как ключевое слово языка. Кроме того, они сообщают вам, что тип этого идентификатора неявно назначается как int, что является функцией совместимости GCC и некоторых других компиляторов Си. Начиная с C99, такое объявление недопустимо в C, и если вы используете опцию компиляции строгого (er) -соответствия, такую ​​как -std=c99, то компилятор отклонит его.

Я знаю, что C не является языком ООП, поэтому он не должен содержать классов.

Не содержит классов, было бы более подходящим способом сформулировать это. Но это не значит, что оно признает слово «класс» как нечто, от чего оно должно конкретно отказаться. Скорее, это означает, что слово «класс» не признается чем-то особенным.

1 голос
/ 08 июля 2019

Причин две. Во-первых, CodeBlocks почему-то обманывает вас, выделяя слово, не являющееся ключевым словом в C. Во-вторых, древнее правило «неявного int», отброшенное стандартом C в C 2011, компилируется.ваш class; как int class;.Я полагаю, что если вы только начинаете, вы должны поставить -pedantic-errors -Wall в опциях компиляции, чтобы вы были защищены от этого и других подобных действий.

0 голосов
/ 08 июля 2019

Это правильно. class в вашем случае является объявлением переменной, имеющей имя class. Поскольку вы не указали тип, по умолчанию используется значение int. Поскольку есть предупреждение, IDE выделяет эту декларацию.

...