Liste des Groupes | Revenir à cl c |
bart <bc@freeuk.com> writes:I think that the C standards don't forbid the conversion, but the description of pointer conversions (6.3.2.3) does not describe such conversions. That makes it, AFAICS, undefined behaviour rather than "forbidden" (which I would define as something that mandates a diagnostic).On 28/03/2024 19:38, Keith Thompson wrote:The warnings I get from gcc are:Kaz Kylheku <433-929-6894@kylheku.com> writes:>
[...]Conversions between function pointers and data pointers are anISO C does require a cast. The cast is necessary to avoid a
extension; it is not well-defined behavior in ISO C.
>
Therefore we can neither say that ISO C doesn't require a cast there (it
imposes no requirements at all), nor that the conversion is fine with a
cast.
>
The cast is /likely/ necessary, in order to correctly trigger the
extension.
constraint violation and a mandatory diagnostic. The resulting
behavior is undefined in ISO C, but defined by POSIX. Assigning a
void* value to a pointer-to-function object without a cast violates
the constraint for simple assignment (N1570 6.5.16.1p1).
What would such a cast look like? Since this gives a warning with
-Wpedantic even with a cast:
>
void* p;
void(*q)(void);
>
p=(void*)q;
q=(void(*)(void))p;
warning: ISO C forbids conversion of function pointer to object pointer type [-Wpedantic]
warning: ISO C forbids conversion of object pointer to function pointer type [-Wpedantic]
With -pedantic-errors, these become fatal errors.
I disagree with gcc. ISO C doesn't define the behavior, but it doesn't
forbid the conversion. (Anyone who disagrees is invited to cite the
constraint that it violates.)
Note that clang doesn't issue this diagnostic.
Les messages affichés proviennent d'usenet.