¿es seguro pasar los punteros de función y compararlos al igual que los punteros de un objeto normal?

Aquí está la cosa, tengo varias funciones,

void foo() {}
void bar() {}

Y quiero pasar estas funciones como punteros de objetos comunes,

int main()
{
    void (*fptr1)() = foo;
    void (*fptr2)() = fptr1;
    void (*fptr3)() = bar;

    if (fptr1 == foo)
        printf("foo function\n");
    if (fptr2 == foo)
        printf("foo function\n");
    if (fptr3 == foo)
        printf("foo function\n")
}

¿Puedo usar estos punteros de función de esta manera? Y escribí un programa para probarlo, me parece bien. Además, pienso, no como objetos ordinarios que pueden estar enstack oheap, las funciones residen entext segment (¿correcto?), entonces cuando me refiero afoo, ¿me da la dirección física en que función?foo se encuentra en el segmento de texto?

SEGUIR

Si de hecho trabajo con DLL, considere esto: primero, una función ptrfptr se le asigna una función,

ReturnType (*fptr)(ArgType) = beautiful_func;

Dos escenarios aquí,

1) Si beautiful_func no está en DLL, entonces es seguro usar estefptr.

2) si está en DLL, luego, creo que no sería seguro usarfptr, porque ahora puede referirse a una función totalmente diferente que no esfptr nació para, ¿verdad?

Respuestas a la pregunta(4)

Su respuesta a la pregunta