|
| static void ? Fra : Lasse Madsen |
Dato : 05-04-04 13:29 |
|
Hej...
jeg sidder og kigger på en funktion der anvender "static void" men hvorfor ?
hvad kan være static når en void ikke kan retunere ?
static void ftpSndSize( char *ftpCommand, long len )
{
static char ltoa[12]={ ':', 0 } ; //Conversion buffer
int i;
int l;
l = strlen( ftpCommand ); //ftpCommand concat point
for (i=1 ; len ; ++i, len/=10) //Convert binary to ASCII
ltoa[i] = '0' + (char)(len % 10L) ;
ltoa[i++] = ',' ;
while (i)
*(ftpCommand + l++) = ltoa[--i]; //Reverse concat into command
*(ftpCommand + l) = '\0' ; //NULL Terminate
}
m.v.h.
Lasse Madsen
| |
Bertel Brander (05-04-2004)
| Kommentar Fra : Bertel Brander |
Dato : 05-04-04 13:53 |
|
Lasse Madsen wrote:
> Hej...
>
> jeg sidder og kigger på en funktion der anvender "static void" men hvorfor ?
> hvad kan være static når en void ikke kan retunere ?
>
> static void ftpSndSize( char *ftpCommand, long len )
> {
> static char ltoa[12]={ ':', 0 } ; //Conversion buffer
static betyder i denne sammenhæng at funktionen kun kan kaldes/ses i
den fil hvori den er erklæret. DVS funktionen kan ikke laves extern.
static har intet med retur værdien at gøre.
En void funktion kan godt returnere, men den kan ikke returnere noget.
/b
| |
Lasse Madsen (05-04-2004)
| Kommentar Fra : Lasse Madsen |
Dato : 05-04-04 14:31 |
|
Hej Betel
hvad så med
void main (void)
{
return (0);
}
er det tilladt ?
og hvor retunere den så hen ?
stopper afviklingen eller starter det forfra igen ?
m.v.h.
l. madsen
| |
Kent Friis (05-04-2004)
| Kommentar Fra : Kent Friis |
Dato : 05-04-04 14:33 |
|
Den Mon, 5 Apr 2004 15:30:53 +0200 skrev Lasse Madsen:
> Hej Betel
>
> hvad så med
>
> void main (void)
> {
> return (0);
> }
>
> er det tilladt ?
Nej, void main er aldrig tilladt.
Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/
| |
Christian B. Andrese~ (05-04-2004)
| Kommentar Fra : Christian B. Andrese~ |
Dato : 05-04-04 14:49 |
|
"Kent Friis" <leeloo@phreaker.net> wrote in message
news:c4rn75$7ug$2@sunsite.dk...
> Den Mon, 5 Apr 2004 15:30:53 +0200 skrev Lasse Madsen:
> > Hej Betel
> >
> > hvad så med
> >
> > void main (void)
> > {
> > return (0);
> > }
> >
> > er det tilladt ?
>
> Nej, void main er aldrig tilladt.
Det afhænger vel af OS, kerne, compiler etc. ?
--
mvh/rg. Christian
If it isn't broken, don't "fix" it --
you may simply break it instead!
| |
Peter Jensen (05-04-2004)
| Kommentar Fra : Peter Jensen |
Dato : 05-04-04 16:02 |
|
Christian B. Andresen wrote:
>> Nej, void main er aldrig tilladt.
>
> Det afhænger vel af OS, kerne, compiler etc. ?
Nej.
ANSI/ISO C specificerer udelukkende main funktioner der returnerer int.
Compileren kan godt vælge at fortolke en void main på en fornuftig måde,
men standarden kalder det "udefineret" (med andre ord, *farligt*). GCC
smider en warning ved void main. Hvis vi snakker C++, så er void main
direkte forbudt af standarden. GCC afbryder med fejl, og jeg vil blive
overrasket hvis der findes opdaterede compilere der alligevel accepterer
det.
P.S. Af en tilfældig signatur at være, så ramte den da meget relevant
her ...
--
PeKaJe
We don't really understand it, so we'll give it to the programmers.
| |
Kent Friis (05-04-2004)
| Kommentar Fra : Kent Friis |
Dato : 05-04-04 16:02 |
|
Den Mon, 5 Apr 2004 15:49:23 +0200 skrev Christian B. Andresen:
>
> "Kent Friis" <leeloo@phreaker.net> wrote in message
> news:c4rn75$7ug$2@sunsite.dk...
>> Den Mon, 5 Apr 2004 15:30:53 +0200 skrev Lasse Madsen:
>> > Hej Betel
>> >
>> > hvad så med
>> >
>> > void main (void)
>> > {
>> > return (0);
>> > }
>> >
>> > er det tilladt ?
>>
>> Nej, void main er aldrig tilladt.
>
> Det afhænger vel af OS, kerne, compiler etc. ?
Nope.
main() skal returnere int i både C og C++.
Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/
| |
Bertel Lund Hansen (05-04-2004)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 05-04-04 15:16 |
|
Lasse Madsen skrev:
>Hej Betel
Han hedder nu det samme som jeg ...
>hvad så med
>void main (void)
>{
>return (0);
>}
>er det tilladt ?
Det er en dårlig idé at snyde den læsende programmør til at tro
at man ikke returnerer nogen værdi, og så returnere én alligevel.
Hvis compileren accepterer det, er den dårlig.
>og hvor retunere den så hen ?
Hvis man laver en normal int main() og returnerer et tal, så er
det det kaldende program der kan aflæse denne værdi, og det vil
ofte være styresystemet.
>stopper afviklingen eller starter det forfra igen ?
Afviklingen stopper. I Dos/Win kan du aflæse den returnerede
værdi med en stribe "if errorlevel xx ..." hvis du kører sådan et
program fra en kommandoprompt eller en batfil.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Bertel Brander (05-04-2004)
| Kommentar Fra : Bertel Brander |
Dato : 05-04-04 18:54 |
|
Bertel Brander wrote:
> Lasse Madsen wrote:
>
>> Hej...
>>
>> jeg sidder og kigger på en funktion der anvender "static void" men
>> hvorfor ?
>> hvad kan være static når en void ikke kan retunere ?
>>
>> static void ftpSndSize( char *ftpCommand, long len )
>> {
>> static char ltoa[12]={ ':', 0 } ; //Conversion buffer
>
>
> static betyder i denne sammenhæng at funktionen kun kan kaldes/ses i
> den fil hvori den er erklæret. DVS funktionen kan ikke laves extern.
Hvis man skal være en anelse mere pedantisk:
static betyder i denne sammehæng at funktions navnet kun er synligt
i den "transaltion unit" hvori funktionen er erklæret.
En translations unit et typisk en c/cpp fil + de filer den #include'er
Fra C99 draft:
"5.1.1.1 Program structure
A C program need not all be translated at the same time.
The text of the program is kept in units called source files, (or
preprocessing files) in this International Standard. A source file
together with all the headers and source files included via the
preprocessing directive #include is known as a preprocessing translation
unit. After preprocessing, a preprocessing translation unit is called a
translation unit. Previously translated translation units may be
preserved individually or in libraries. The separate translation units
of a program communicate by (for example) calls to functions whose
identifiers have external linkage, manipulation of objects whose
identifiers have external linkage, or manipulation of data files.
Translation units may be separately translated and then later linked to
produce an executable program."
Man kan godt putte en static funktion i en header-fil, og inkludere
denne i sin c/c++ fil, funktionen vil dermed være synlig i en anden fil
end den, den er erklæret i.
Man kan godt kalde en static funktion fra en anden "translation unit",
ved f.ex. at lave en functions pointer der peger på den static funktion
og lave funktions pointeren extern.
/b
| |
Lasse Westh-Nielsen (06-04-2004)
| Kommentar Fra : Lasse Westh-Nielsen |
Dato : 06-04-04 19:41 |
|
Bertel Brander wrote:
> >> static void ftpSndSize( char *ftpCommand, long len )
> >> {
> >> static char ltoa[12]={ ':', 0 } ; //Conversion buffer
> > static betyder i denne sammenhæng at funktionen kun kan kaldes/ses i
> > den fil hvori den er erklæret. DVS funktionen kan ikke laves extern.
> static betyder i denne sammehæng at funktions navnet kun er synligt
> i den "transaltion unit" hvori funktionen er erklæret.
Bare for lige at elaborere: i ovenstående eksempel er der to betydninger af
static i spil. static i globalt/ translation unit scope og static i en
funktions scope.
Jeg fandt en glimrende forklaring på nettet igår:
http://users.cyberelectric.net.au/~collins/BackIssues/1999-5.htm
I samme forbindelse er jeg begyndt at indse at min kære gamle K&R bog er for
lille en kilde til viden om C. Findes der en god bog der fortæller mere om C
end K&R gør, fx om keywords, standardbiblioteket (realloc), andre ting?
Jeg har overvejet at købe Bjarne-bogen når jeg en dag får råd, men den
fortæller vel ikke meget om C, gør den?
mvh Lasse
--
Lasse Westh-Nielsen
lasse@daimi.au.dk
| |
Mogens Hansen (06-04-2004)
| Kommentar Fra : Mogens Hansen |
Dato : 06-04-04 20:48 |
|
Lasse Westh-Nielsen wrote:
[8<8<8<]
> Jeg har overvejet at købe Bjarne-bogen når jeg en dag får råd, men den
> fortæller vel ikke meget om C, gør den?
Den (The C++ Programming Language) fortæller naturligvis om C++.
Den fortæller f.eks. at brugen af "static" til at betyde "lokal i en
translation unit" ikke er tilrådeligt (deprecate feature) i C++, og at
man anvender "unnamed namespace" istedet.
Desuden fortæller den om static member funktioner og static datamember i
C++, som giver static endnu en betydning, nemlig at den tilhører en
klasse og ikke objekter (instanser) af en klasse.
Det kan anbefales at købe den bog (Third Edition eller Special Edition)
hvis man vil vide hvad C++ er. Den er vanskelig at komme uden om.
Foruden beskrivelsen af C++ har den mange gode litteratur henvisninger
og et godt, pragmatisk kapitel om udvikling og design.
Venlig hilsen
Mogens Hansen
| |
Ukendt (07-04-2004)
| Kommentar Fra : Ukendt |
Dato : 07-04-04 00:02 |
|
Hej Lasse
"Lasse Westh-Nielsen" <lasse@daimi.au.dk> skrev i en meddelelse
news:c4utka$k2f$1@sunsite.dk...
> I samme forbindelse er jeg begyndt at indse at min kære gamle K&R bog er
for
> lille en kilde til viden om C. Findes der en god bog der fortæller mere om
C
> end K&R gør, fx om keywords, standardbiblioteket (realloc), andre ting?
>
> Jeg har overvejet at købe Bjarne-bogen når jeg en dag får råd, men den
> fortæller vel ikke meget om C, gør den?
>
Bjarnes bog omhandler kun C++, den er en glimrende reference for dette
sprog, men hvis du er interesseret i C så duer den ikke.
Jeg har altid brugt K&R 2 edition som mit opslagsværk om C (Ansi C).
Der er dokumentation på sproget og på standard bibliotekérne.
Skal du bruge specifike ting til den enkelte compiler/platform skal du
selvfølgeligt have fat i de specifike bøger der hører til her.
Er det 1. edition af K&R du har ?
Der findes enkelt compilere der kun lever op til K&R 1.edition, men det er
fåtallet. Langt de fleste har Ansi compatibilitet.
Med venlig hilsen
Jesper Wolf Jespersen
PS Ja der findes mange nyere standarder end Ansi, men jeg kender ingen bøger
der giver en mere koncis og lettilgængelig gennemgang af en forholdsvis
moderne C end K&R 2.edition.
| |
|
|