Liste des Groupes | Revenir à cl c |
On 29/03/2024 12:58, David Brown wrote:A single cast is all that is needed as far as the C standards are concerned, but the double cast is helpful to silence the gcc warning.On 28/03/2024 21:30, bart wrote:I was aware of the double conversion but KT used 'a cast' so I wondered if there was a single cast that could be used.On 28/03/2024 19:38, Keith Thompson wrote:>Kaz Kylheku <433-929-6894@kylheku.com> writes:>
[...]Conversions between function pointers and data pointers are an>
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.
ISO C does require a cast. The cast is necessary to avoid a 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;
>
>
One method that silences all gcc warnings here is to cast via uintptr_t:
>
#include <stdint.h>
>
void* p;
void(*q)(void);
>
typedef void(*FVoid)(void);
>
void foo(void) {
p = (void*) (uintptr_t) q;
}
>
void bar(void) {
q = (FVoid) (uintptr_t) p;
}
It is odd however that function and object pointers can be considered so different that even an explicit conversion between them is deemed to be meaningless.Why? They are such totally different concepts in C. It does not make sense, within the semantics of C, to consider functions as data or data as functions.
Yet converting either to and from an integer type is perfectly fine, even though it isn't even a pointer type!I'd be happy if C required a bit more effort for converting back and forth between pointers and integer types - the ease here is for historic reasons, I think. But at least it needs a cast.
I wonder then why a conversion between function and object couldn't be implemented, internally, via such an intermediate integer type anyway.I'm sure it could.
Les messages affichés proviennent d'usenet.