Почему этот корректный код на C не собирается компилятором С++?

Компьютеры программирование программы

собственно сам код:

#include <stdio.h>

typedef struct mystr {
int a;
int b;
int try;
} mystr;

int main(int argc, char **argv)
{
printf ("%d\n", argc);
if (argc>0) main(argc-1, argv);

return 0;
}


Примечание:
Этот код ни в одном компиляторе C++ не соберётся. Никогда. Даже синтаксический анализатор не пройдёт.

Подсказка: Это вопрос на знание стандартов С и С++

Примечание:
Забыл закрыть этот вопрос ^_^


И так разгадка загадки:

> #include <stdio.h>

Так нельзя писать, т.к. С кодирует только имя функции, а C++ -- имя функции и типы её аргументов. Для А заголовки в stdio.h записаны для C-библиотек. В результате С++ компилятор не сможет найти нужных библиотек.
Конечно, можно извращаться с extern "C", но это неправильно.
Правильно строка должна писаться так:
#include <сstdio>
Т.е. в начале добавляется "c" и удаляется расширение в конце.

Большинство стандартных библиотек умеет работать как с С, так и с С++ как раз именно из-за фокуса с extern "C" и __cplusplus. Но они не обязаны этого делать.

> int try;

Ну, это всё увидели. Да, действительно тут использовано ключевое слово "try" языка C++, но не языка C, в котором такого ключевого слова нет. Это был вопрос на знание , что ключевых слов в C++ больше, чем C.

> if (argc>0) main(argc-1, argv);

Большинству компилятором вообще-то на это насрать, но по стандарту C++ функция main не должна никогда вызываться. А вот стандарт C этого не запрещает и микроконтроллер тут не причём.

И немного обсудим неверные ответы:
Рекурсия стандартом С++ не запрещена, а если компилятор на неё ругает, то это проблемы компилятора.
typedef везде одинаковый. Видимо John Freeman имел ввиду разницу в приведении типов, но это отдельная тема.


Итак результаты: 2 из 3 правильных ответа дал конструктор. Соответственно победа за ним.
Ответы:
Телепаты в отпуске. Компиляторов и диалектов куча. Умные будут ругаться на self рекурсию, нестандартные на typedef - он везде разный.
mystr::try неверное название для поля, поскольку try является зарезервированным ключевым словом. Даже стандарт для этого не нужно открывать :)
1. try зарезервированное слово - компилятор ругается.
2.  if (argc>0) main(argc-1, argv);- пытаемся вызвать функцию main и передать ей новые параметры. По логике работы микроконтроллера ни кто не может вызвать функцию main повторно и в функцию main ничего не передается.
int try, из-за этого и не соберется. И это вы мне о незнании банальных вещей говорили?


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.