Re: C89 "bug"

Liste des GroupesRevenir à cl c  
Sujet : Re: C89 "bug"
De : Keith.S.Thompson+u (at) *nospam* gmail.com (Keith Thompson)
Groupes : comp.lang.c
Date : 13. Dec 2024, 21:29:13
Autres entêtes
Organisation : None to speak of
Message-ID : <87frmruy1y.fsf@nosuchdomain.example.com>
References : 1 2 3
User-Agent : Gnus/5.13 (Gnus v5.13)
Thiago Adams <thiago.adams@gmail.com> writes:
Em 12/13/2024 3:15 PM, Keith Thompson escreveu:
Thiago Adams <thiago.adams@gmail.com> writes:
Does anyone knows how can I convert this code (external declaration)
to C89?
>
union U {
     int i;
     double d;
};
>
union U  u = {.d=1.2};
>
The problem is that in C89 only the first member of the union is
initialized.
The obvious solution is:
     union U u;
     u.d = 1.2;
But that works only if u has automatic storage duration.
You could also define a function that takes a double argument and
returns a union U result.
>
Like this?
union U {
    int i;
    double d;
};
union U f(){ union U u; u.d = 1.2; return u;}
union U u = f();
>
The problem is that f() is not a constant expression for external
declarations.

Yes, that's a good point.  Even in modern C, the initializer for
a static object has to be constant.

A function probably doesn't have much advantage over assigning
the member directly.  Either way, that code has to be executed in
some function.

If this is in human-written code, then there's the risk of forgetting
to invoke the initialization code (or invoking it at the wrong time),
since it can't be directly associated with the object definition.
That's why the C99 and later solution is IMHO much better.)
But if this is generated code, you can just generate code to do
the assignment, perhaps in main().

Initializing u to some known invalid value, if there is one, could
help in detecting the error of forgetting to set a valid value.

--
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
void Void(void) { Void(); } /* The recursive call of the void */

Date Sujet#  Auteur
13 Dec 24 * C89 "bug"17Thiago Adams
13 Dec 24 +* Re: C89 "bug"6Michael S
13 Dec 24 i`* Re: C89 "bug"5Thiago Adams
13 Dec 24 i `* Re: C89 "bug"4Kaz Kylheku
13 Dec 24 i  `* Re: C89 "bug"3Thiago Adams
13 Dec 24 i   `* Re: C89 "bug"2bart
13 Dec 24 i    `- Re: C89 "bug"1Thiago Adams
13 Dec 24 +* Re: C89 "bug"8Keith Thompson
13 Dec 24 i`* Re: C89 "bug"7Thiago Adams
13 Dec 24 i +* Re: C89 "bug"5David Brown
13 Dec 24 i i+* Re: C89 "bug"2Thiago Adams
13 Dec 24 i ii`- Re: C89 "bug"1Thiago Adams
14 Dec 24 i i`* Re: C89 "bug"2bart
15 Dec 24 i i `- Re: C89 "bug"1David Brown
13 Dec 24 i `- Re: C89 "bug"1Keith Thompson
14 Dec 24 `* Re: C89 "bug"2Waldek Hebisch
14 Dec 24  `- Re: C89 "bug"1Keith Thompson

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal