Liste des Groupes | Revenir à cl c |
Kaz Kylheku <433-929-6894@kylheku.com> writes:
>On 2024-03-28, Kenny McCormack <gazelle@shell.xmission.com> wrote:>
>But here's the thing. Is the casting of the result of dlsym()>
[to a function pointer type] necessary?
Isn't this the same as "casting the return value of malloc()", where you
Conversions between function pointers and data pointers are an
extension; it is not well-defined behavior in ISO C.
>
I also seem to remember something like this, but I cannot trust this
documentation without a chapter-and-verse citation.
https://pubs.opengroup.org/onlinepubs/9699919799/functions/dlsym.html
>Assuming it is true, there you have it; if you're on POSIX, the compiler>
is required to have the extension and it is connected to casting,
in which case the cast is required.
I've used this form for the last two decades, with gcc, with no
issues:
>
/**
* Each shared object that simulates a Data Link Processor (DLP), will
* contain a single namespace-scope function <b>get_dlp</b> which constructs
* a DLP object of the specified type (for example, a #c_uniline_dlp,
* #c_card_reader_dlp, et alia). <b>get_dlp</b> returns the constructed
* object as a #c_dlp object to the #channel function, which is then used
* by the I/O subsystem to request services of the DLP at the MLI level.
*/
typedef c_dlp* (*get_dlp_t)(const char *, uint64_t, c_logger *);
...
get_dlp_t sym;
...
>
sym = (get_dlp_t)dlsym(handle, "get_dlp");
if (sym == NULL) {
lp->log("Invalid DLP shared object format: %s\n", dlerror());
unregister_handle(channel);
dlclose(handle);
return 1;
}
>
>I think there was a time in the development of GCC when there was>
a warning even with the cast. I don't think it's enabled by default
now?
We compile with -Wall -Werror and have never seen any warnings related to
casting the result of dlsym(), and we build with GCC[4..13].
Les messages affichés proviennent d'usenet.