¿Hay alguna manera de usar direcciones de función en expresiones constantes?¿Por qué las direcciones de función no son expresiones constantes?
void foo()
{}
int main()
{
static_assert(&foo, "test error");
}
Esto no se compilará.
C2057 de error: se esperaba expresión constante
La intención de esto es que quiero comparar dos direcciones de las funciones en tiempo de compilación.
Creo que esto podría ser un poco más complicado. Uno de los problemas con las direcciones de funciones es que el compilador no necesariamente * sabe * su valor (puede definirse en una unidad de traducción diferente o no definirse en absoluto. ¿Cuál es el resultado esperado (en * tiempo de compilación *) de '& foo 'para esos casos? (No digo que no se pueda hacer, esa expresión se considera * odr-use *, por lo que el compilador puede suponer que se debe definir y dejar que el enlazador resuelva que la dirección es incorrecta si no está definida, pero Me gustaría ir a la norma para una respuesta autorizada a la pregunta. –
Las funciones se conocen en tiempo de compilación, pero sus direcciones no lo son. Los nombres simbólicos se utilizan en tiempo de compilación para el enlazador a la memoria de mapa más tarde. Para complicar aún más las cosas, después las plantillas se introdujeron en C++, los enlazadores casi universalmente comenzaron a plegar funciones que tienen un código compilado idéntico. Por lo tanto ** dos funciones diferentes podrían tener la misma dirección en tiempo de ejecución **. No se espera que el compilador lo sepa. –
S Las funciones ince pueden reubicarse en el momento de la carga (piense en la DLL de Windows) y luego no puedo ver cómo se puede conocer '& foo', en general, hasta que se ejecute el programa. –