Pozwoliłem gcc
skompilować następujący przykład stosując -Wall -pedantic
:Jak wydrukować adres funkcji?
#include <stdio.h>
int main(void)
{
printf("main: %p\n", main); /* line 5 */
printf("main: %p\n", (void*) main); /* line 6 */
return 0;
}
uzyskać:
main.c:5: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int (*)()’
main.c:6: warning: ISO C forbids conversion of function pointer to object pointer type
Linia 5 podjąłem zmienić kod tak jak w wierszu 6.
Czego mi brakuje do usunąć ostrzeżenie podczas drukowania adresu funkcji?
Nie wiem, czy to jest dostępne, ale można zbadać za pomocą register_printf_function do [zdefiniować własny znak specjalny konwerter formatu i] (http://www.gnu.org/software/libc/manual/html_node/ Dostosowywanie-Printf.html # Dostosowywanie-Printf). –
Problem nie polega na tym, że jest "niebezpieczny". Problem polega na tym, że konwersja nie jest definiowana przez język C, a zatem nie może być używana w zgodnym z C-kodzie. Można rzutować pośredni typ liczb całkowitych (wyniki definiowane przez implementację), o ile wiesz, że istnieje taki, który może pomieścić wskaźniki funkcji i obiektu). –
@BobJarvis Czy masz pojęcie jak ominąć 'gcc' narzekając na nowo wprowadzony typ znaku konwersji (' warning: nieznany typ konwersji 'P' w formacie') podczas kompilacji z opcją '-Wall'? Ale to także inna historia ... – alk