стандарт c

Модератор: Модераторы разделов

Аватара пользователя
shnek
Сообщения: 10
ОС: Fedora Core 6

стандарт c

Сообщение shnek »

В каком стандарте С можно определять функции внутри main?:
void main(){
void func1(){
...
}
...
}
Спасибо сказали:
Аватара пользователя
drakosha
Сообщения: 10
ОС: ArchLinux current

Re: стандарт c

Сообщение drakosha »

Никогда не слышал про C в котором можно определять функцию в функции.
Registered Linux user #312804
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: стандарт c

Сообщение oav »

а _зачем_? :unsure:
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: стандарт c

Сообщение Liksys »

Действительно, зачем?
Можно, кстати, внутри функции определить блок типа {...} со своими переменными, которые не бодут доступны извне.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: стандарт c

Сообщение elide »

В каком стандарте С можно определять функции внутри main?
хм... а в каком нельзя?

Код: Выделить всё

elide@serenity| ~/exp/c >> cat inner_funcs.c
#include <stdio.h>
int f(void);
int main(){
        int f(void){
                return printf("test\n");
        }
        return f();
}
elide@serenity| ~/exp/c >> gcc -std=c89 -Wall -o inner inner_funcs.c
elide@serenity| ~/exp/c >> ./inner
test
elide@serenity| ~/exp/c >> gcc -std=c99 -Wall -o inner inner_funcs.c
elide@serenity| ~/exp/c >> ./inner
test
elide@serenity| ~/exp/c >> gcc -std=c9x -Wall -o inner inner_funcs.c
elide@serenity| ~/exp/c >> ./inner
test
elide@serenity| ~/exp/c >>
чем определение функции отличается от определения всего остального?
слава роботам!
Спасибо сказали:
Аватара пользователя
Бодрый и Веселый
Сообщения: 66
ОС: What?

Re: стандарт c

Сообщение Бодрый и Веселый »

а _зачем_?

Для того чтобы не плодить в общей оласти видимости ненужных функций.
Это ограниченине больше относится к c++. Можно обойти:

Код: Выделить всё

#include <stdio.h>
int main(){
        struct {
            int operator()() {
                return printf("test\n");
            }
        } f;
        return f();
}
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: стандарт c

Сообщение oav »

Бодрый и Веселый писал(а):
06.12.2006 20:00
Для того чтобы не плодить в общей оласти видимости ненужных функций.
Это ограниченине больше относится к c++. Можно обойти:

Ну коли уж было произнесено слово С++, то пожалуйста (и без всякого мракобесия типа вложенных функций):

Код: Выделить всё

#include <iostream>
namespace
{
    void superLocalFunction()
    {}
    int mySuperLocalData;
}

int main()
{
    superLocalFunction();
    return 0;
}

называется anonymous namespaces. Не оно?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: стандарт c

Сообщение v04bvs »

oav писал(а):
07.12.2006 00:50
называется anonymous namespaces. Не оно?

Слушай, можешь объяснить, чем оно лучше\хуже static declarations? Я вот не пойму, зачем оно надо.
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: стандарт c

Сообщение oav »

v04bvs писал(а):
07.12.2006 00:52
oav писал(а):
07.12.2006 00:50

называется anonymous namespaces. Не оно?

Слушай, можешь объяснить, чем оно лучше\хуже static declarations? Я вот не пойму, зачем оно надо.


их extern'ом не достать - чисто локальные имена на одну единцу трансляции. Хотя вот я это написал и тутже захотелось в стандарт слазить - забыл ужо всё, чёртов С# все мозги вытряс. Но поздно уже, завтра слазию...
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: стандарт c

Сообщение v04bvs »

oav писал(а):
07.12.2006 00:54
v04bvs писал(а):
07.12.2006 00:52

oav писал(а):
07.12.2006 00:50

называется anonymous namespaces. Не оно?

Слушай, можешь объяснить, чем оно лучше\хуже static declarations? Я вот не пойму, зачем оно надо.


их extern'ом не достать - чисто локальные имена на одну единцу трансляции. Хотя вот я это написал и тутже захотелось в стандарт слазить - забыл ужо всё, чёртов С# все мозги вытряс. Но поздно уже, завтра слазию...

Ты и static extern-ом не достанешь. Он не экспортируется из объектного файла.
Спасибо сказали:
Аватара пользователя
shnek
Сообщения: 10
ОС: Fedora Core 6

Re: стандарт c

Сообщение shnek »

В ANSI C этого нет, но GNU включает некоторые свойства, которых нет в ANSI. Одним из них и являются вложенные функции.
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: стандарт c

Сообщение fatboy »

shnek писал(а):
11.12.2006 20:37
В ANSI C этого нет, но GNU включает некоторые свойства, которых нет в ANSI. Одним из них и являются вложенные функции.

насколько я знаю, gcc работает со стандартом ISO а не ANSI. Посмотри этот стандарт на предмет интересующего тебя вопроса.
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
Paul7
Сообщения: 40

Re: стандарт c

Сообщение Paul7 »

Ответ: можно в ANSI/ISO C99, нельзя в более ранних стандартах.
HP i2000 Dual Itanium / Debian Sarge & Win2k3
Sun Ultra 5 M270 / OpenSolaris Nevada-41
DEC Multia VX42 / OpenBSD 3.8
HP 9000 Model C100 / HP-UX B.11.00
Спасибо сказали: