Вопрос по поводу возвращаемого значения
От: YourLastSong  
Дата: 15.09.11 17:23
Оценка:
Здравствуйте, уважаемые господа.

До сих пор думал, что указывать возвращаемое значение для любой функции в C++ совершенно обязательно даже в том случае, если данная функция возвращает int, в отличие от языка C. Недавно, просматривая какой-то видеоурок, наткнулся на то, что автор не указывает тип возвращаемого значения у main в C++, при этом компиляция программы происходит без каких-либо ошибок. Почему? К сожалению, обратить внимание на среду разработки я тогда не догадался.

В том же видеоуроке увидел использование конструкции вида

#include "stdio.h";

В данном случае компиляция не была выполнена вообще, выдав сообщение об ошибке.

Попробовал выполнить такой же код в Visual Studio — код скомпилировался. Почему? Может, дело в том, что автор писал на C, а не на C++ или как?

Заранее благодарю за возможные ответы.
Re: Вопрос по поводу возвращаемого значения
От: wander  
Дата: 15.09.11 17:32
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Здравствуйте, уважаемые господа.


YLS>До сих пор думал, что указывать возвращаемое значение для любой функции в C++ совершенно обязательно даже в том случае, если данная функция возвращает int, в отличие от языка C. Недавно, просматривая какой-то видеоурок, наткнулся на то, что автор не указывает тип возвращаемого значения у main в C++, при этом компиляция программы происходит без каких-либо ошибок. Почему? К сожалению, обратить внимание на среду разработки я тогда не догадался.


По стандарту С++ у main можно не писать return, если предполагается возвращать ноль. Больше нигде так делать нельзя.
Re[2]: Вопрос по поводу возвращаемого значения
От: YourLastSong  
Дата: 15.09.11 17:34
Оценка:
W>По стандарту С++ у main можно не писать return, если предполагается возвращать ноль. Больше нигде так делать нельзя.

Про return я итак знаю, интересует именно тип возвращаемого значения, например int main.
Re[3]: Вопрос по поводу возвращаемого значения
От: watch-maker  
Дата: 15.09.11 18:11
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Про return я итак знаю, интересует именно тип возвращаемого значения, например int main.

И в языке C, и в языке C++ для функции main должны поддерживаться две сигнатуры:
int main(void);
и
int main(int argc, char* argv[]);

Поддержка другие вариантов, с другим набором аргументов или с другим типом возвращаемого значения, — implementation-defined. То есть делается по желанию разработчиков компилятора.
Re[3]: Вопрос по поводу возвращаемого значения
От: niXman Ниоткуда https://github.com/niXman
Дата: 15.09.11 18:13
Оценка:
Здравствуйте, YourLastSong, Вы писали:

W>>По стандарту С++ у main можно не писать return, если предполагается возвращать ноль. Больше нигде так делать нельзя.


YLS>Про return я итак знаю, интересует именно тип возвращаемого значения, например int main.

так же говорится, что main() не может возвращать void.
но микрософтстудийный компилер не славится соответствием стандарту(в прочем как и борланд). так что ничего удивительного.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: Вопрос по поводу возвращаемого значения
От: watch-maker  
Дата: 15.09.11 18:23
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, YourLastSong, Вы писали:


W>>>По стандарту С++ у main можно не писать return, если предполагается возвращать ноль. Больше нигде так делать нельзя.


YLS>>Про return я итак знаю, интересует именно тип возвращаемого значения, например int main.

X>так же говорится, что main() не может возвращать void.
Где, простите, такое говориться?
В С++ пункт 3.6.2 Main function (2):
> It shall have a return type of type int, but otherwise its type is implementation-defined.
Аналогичный пункт есть и в C99 — 5.1.2.2.1 Program startup — делайте что хотите, хоть int, хоть void, если это поддерживается компилятором.
Re[4]: Вопрос по поводу возвращаемого значения
От: YourLastSong  
Дата: 15.09.11 18:41
Оценка:
WM>Поддержка другие вариантов, с другим набором аргументов или с другим типом возвращаемого значения, — implementation-defined. То есть делается по желанию разработчиков компилятора.

Я имею ввиду то, что в C вполне возможна конструкция вида

main ()
{
return 0;
}

В таком случае компилятор будет, разумеется, считать, что тип возвращаемого значения именно int.

В C++ такого вроде нет, поэтому такая конструкция будет возможна только в C, разве нет?

Я что-то не так понял, да?
Re[5]: Вопрос по поводу возвращаемого значения
От: niXman Ниоткуда https://github.com/niXman
Дата: 15.09.11 18:42
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>Здравствуйте, niXman, Вы писали:


X>>Здравствуйте, YourLastSong, Вы писали:


W>>>>По стандарту С++ у main можно не писать return, если предполагается возвращать ноль. Больше нигде так делать нельзя.


YLS>>>Про return я итак знаю, интересует именно тип возвращаемого значения, например int main.

X>>так же говорится, что main() не может возвращать void.
WM>Где, простите, такое говориться?
WM>В С++ пункт 3.6.2 Main function (2):
>> It shall have a return type of type int, but otherwise its type is implementation-defined.
WM>Аналогичный пункт есть и в C99 — 5.1.2.2.1 Program startup — делайте что хотите, хоть int, хоть void, если это поддерживается компилятором.

да, простите, ошибся.
3.6.1-2:

An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined.

пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: Вопрос по поводу возвращаемого значения
От: niXman Ниоткуда https://github.com/niXman
Дата: 15.09.11 18:45
Оценка:
хотя Страуструп говорит немного иначе: http://www2.research.att.com/~bs/bs_faq2.html#void-main
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: Вопрос по поводу возвращаемого значения
От: watch-maker  
Дата: 15.09.11 18:55
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Я имею ввиду то, что в C вполне возможна конструкция вида


YLS>main ()

YLS>{
YLS>return 0;
YLS>}

YLS>В таком случае компилятор будет, разумеется, считать, что тип возвращаемого значения именно int.


YLS>В C++ такого вроде нет, поэтому такая конструкция будет возможна только в C, разве нет?


Правило, что функиция возвращает int, если явно не указано другое, действительно было в языке C когда-то очень давно. Сейчас такого в языке нет. Это ошибка и в C++ и в C.
Re[6]: Вопрос по поводу возвращаемого значения
От: YourLastSong  
Дата: 15.09.11 19:08
Оценка:
WM>Правило, что функиция возвращает int, если явно не указано другое, действительно было в языке C когда-то очень давно. Сейчас такого в языке нет. Это ошибка и в C++ и в C.

Точно? Когда это появилось в C вообще?
Re[6]: Вопрос по поводу возвращаемого значения
От: niXman Ниоткуда https://github.com/niXman
Дата: 15.09.11 19:14
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>Здравствуйте, YourLastSong, Вы писали:


YLS>>Я имею ввиду то, что в C вполне возможна конструкция вида


YLS>>main ()

YLS>>{
YLS>>return 0;
YLS>>}

YLS>>В таком случае компилятор будет, разумеется, считать, что тип возвращаемого значения именно int.


YLS>>В C++ такого вроде нет, поэтому такая конструкция будет возможна только в C, разве нет?


WM>Правило, что функиция возвращает int, если явно не указано другое, действительно было в языке C когда-то очень давно. Сейчас такого в языке нет. Это ошибка и в C++ и в C.


хотелось бы увидеть пруф, пожалуйста.
ибо цитаты из стандарта никак об этом не говорят.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: Вопрос по поводу возвращаемого значения
От: watch-maker  
Дата: 15.09.11 19:18
Оценка:
Здравствуйте, YourLastSong, Вы писали:

WM>>Правило, что функиция возвращает int, если явно не указано другое, действительно было в языке C когда-то очень давно. Сейчас такого в языке нет. Это ошибка и в C++ и в C.


YLS>Точно? Когда это появилось в C вообще?

Появилось очень давно. Окончательно исчезло тоже давно — в C99.
Сейчас в языке C эта ситуация называется термином "constraint violation", и компилятор обязан в этом случае сгенерировать соответствующее диагностическое сообщение, что компиляторы успешно и делают.
Разумеется, специально никто эту конструкцию не закрывал, так как диагностическоого сообщения достаточно, и можно продолжать компиляцию. Да и в целях совместимости, тоже, увы, иногда это нужно, — поддержку старого кода никто не отменял.
Re[7]: Вопрос по поводу возвращаемого значения
От: watch-maker  
Дата: 15.09.11 20:18
Оценка: +1
Здравствуйте, niXman, Вы писали:

WM>>Правило, что функиция возвращает int, если явно не указано другое, действительно было в языке C когда-то очень давно. Сейчас такого в языке нет. Это ошибка и в C++ и в C.


X>хотелось бы увидеть пруф, пожалуйста.

X>ибо цитаты из стандарта никак об этом не говорят.

Пруф чего?
Что это правило появилось очень давно? — читайте K&R.

Что в C была практика implicit-int (и не только) для функций — читайте Ansi-C:
>If the expression that precedes the parenthesized argument list in
>a function call consists solely of an identifier, and if no
>declaration is visible for this identifier, the identifier is
>implicitly declared exactly as if, in the innermost block containing
>the function call, the declaration
>
> extern int identifier();
>
>appeared.

Что в С можно было объявлять функции без указания типов? — читайте примеры в Ansi-C:
>Then the definition of g might read
>
>         g(int (*funcp)(void))
>         {
>                  /*...*/ (*funcp)() /*  or funcp() ... */
>         }


Что сейчас такого правила нет? — читайте C99.
Там даже эти примеры переписали:
>Then the definition of g might read
>void g(int (*funcp)(void))
>    {
>        /* ... */
>        (*funcp)() /* or funcp() ... */
>    }
Re[5]: Вопрос по поводу возвращаемого значения
От: quodum  
Дата: 16.09.11 05:44
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>В С++ пункт 3.6.2 Main function (2):

>> It shall have a return type of type int, but otherwise its type is implementation-defined.

Эта фраза переводится так: "[Функция main] обязана возвращать значение типа int; в остальном её тип определяется реализацией".

Иными словами, сигнатура функции main определяется реализацией, за исключением возвращаемого типа, который обязан быть int.
Re[5]: Вопрос по поводу возвращаемого значения
От: Masterkent  
Дата: 16.09.11 05:55
Оценка: +1
watch-maker:

X>>так же говорится, что main() не может возвращать void.

WM>Где, простите, такое говориться?
WM>В С++ пункт 3.6.2 Main function (2):
>> It shall have a return type of type int, but otherwise its type is implementation-defined.

Там имелось в виду, что количество параметров и их типы — implementation-defined. Тип возврата должен быть int. Если он не int, то требуется выдача диагностического сообщения (при этом код может успешно компилиться на основаниях п. 1.4/8).
Re[6]: Вопрос по поводу возвращаемого значения
От: Masterkent  
Дата: 16.09.11 05:56
Оценка:
quodum:

Q>Иными словами, сигнатура функции main определяется реализацией, за исключением возвращаемого типа, который обязан быть int.


Тип возврата не является частью сигнатуры функции.
Re: Вопрос по поводу возвращаемого значения
От: MasterZiv СССР  
Дата: 16.09.11 06:54
Оценка: +1
On 15.09.2011 21:23, YourLastSong wrote:

> отличие от языка C. Недавно, просматривая какой-то видеоурок, наткнулся на то,

> что автор не указывает тип возвращаемого значения у main в C++, при этом
> компиляция программы происходит без каких-либо ошибок. Почему?

main -- особый случай, его компилятор по-особому обрабатывает, часто прощая
нестандартность. Это традиция такая. Нестандартная.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Вопрос по поводу возвращаемого значения
От: niXman Ниоткуда https://github.com/niXman
Дата: 16.09.11 09:36
Оценка:
все таки, тип возвращаемого значения обязан быть int?

зы
возвращаемый тип действительно не является частью сигнатуры?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: Вопрос по поводу возвращаемого значения
От: Masterkent  
Дата: 16.09.11 10:12
Оценка:
niXman:

X>все таки, тип возвращаемого значения обязан быть int?


Если у функции main он не int, то программа является ill-formed. В таком случае компилятор должен уметь выдавать диагностическое сообщение, но при этом имеет право успешно скомпилить программу. Например, Intel C++ 12.0 успешно компилирует следующую программу

void main() {}

но при этом выдаёт

warning #1079: return type of function "main" must be "int"

X>возвращаемый тип действительно не является частью сигнатуры?

В случае обычной функции (не являющейся специализацией шаблона) — не является. Определение понятия "сигнатура функции" дано в C++11 — 1.3.17:

signature
<function> name, parameter type list (8.3.5), and enclosing namespace (if any)

Сигнатура функции и тип функции — не одно и то же (эти два понятия часто путают).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.