LINUX.ORG.RU

А давно такое по стандартам собирается?

 , ,


1

0
void
test(void)
{
    return test(); /* wtf? */
}

int
main(int argc, char *argv[])
{
    return 0;
/* UPD: return test(), 0; тоже вполне себе ок */
}
$ gcc -std=c99 -Wall x.c
$ gcc -std=c89 -Wall x.c
$ gcc -ansi -Wall x.c

Обнаружил это в objc/clang, во думаю наконец удобно сделали, мало того, что форварды не надо объявлять, так еще и return void работает, удобно if (shitDidHappen()) return cleanup() делать. Сабж, или это у меня конпелятор кривой?

★★

Последнее исправление: arturpub (всего исправлений: 1)

C[99] так делать нельзя.

6.8.6.4§1

A return statement with an expression shall not appear in a function whose return type is void. A return statement without an expression shall only appear in a function whose return type is void.

В C++ можно возвращать выражение типа void из функций с возвращаемым значением void.

theNamelessOne ★★★★★
()
Ответ на: комментарий от arturpub

Компилятор не позволит так объявить. Интересно, может ли он обнаружить бесконечную рекурсию на стадии компиляции?

Deleted
()
Ответ на: комментарий от theNamelessOne

Википедия говорит что expression это тот, кто produces value. Функция, возвращаюшая void не делает этого.

kike
()

Компилируй с -pedantic.

cc -Wall -pedantic    sample.c   -o sample
sample.c: In function ‘test’:
sample.c:4:5: warning: ISO C forbids ‘return’ with expression, in function returning void [-Wpedantic]
     return test(); /* wtf? */
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от kike

Да, тут самое ололо :)

Технически, test() это statement, а про statement там ничего не сказано. Кто знает где курить, покурите ради интереса.

arturpub ★★
() автор топика
Ответ на: комментарий от theNamelessOne

Воо… Спасибо, будем знать!

x.c:5: warning: ‘return’ with a value, in function returning void
arturpub ★★
() автор топика
Ответ на: комментарий от arturpub

+ kike

Вызов функции всегда expression, вне зависимости от того, возвращает ли она какое-нибудь значение.

Что там написано в Википедии, я не знаю.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

А вот так даже с педантиком не ругается, это тоже можно было что-ли?

void
test(void)
{
    /* return test(); wtf? */
}

int
main(int argc, char *argv[])
{
    return test(), 0;
}

arturpub ★★
() автор топика
Ответ на: комментарий от arturpub

Оператор , сначала вычисляет левый операнд, затем правый операнд и возвращает вычисленное выражение правого операнда.

The left operand of a comma operator is evaluated as a void expression; there is a sequence point between its evaluation and that of the right operand. Then the right operand is evaluated; the result has its type and value.

Т. е., твой код аналогичен:

test();
return 0;
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.