2012-08-28 18 views
7

¿Hay alguna garantía de que las funciones que difieren solo por sus nombres (no los parámetros y el tipo de retorno también) no puedan compartir la misma dirección en C y C++? No veo nada al respecto en el estándar.Punteros de varias funciones

#include <cassert> 

void foo() {} 

void bar() {} 

int main() 
{ 
    assert(foo != bar); 
} 

Respuesta

7

El estándar de C++ 11 dice

5.10 Operadores de igualdad
Punteros del mismo tipo (después de las conversiones de puntero) se pueden comparar por la igualdad Dos punteros del mismo tipo se comparan igual si y solo si son ambos nulos, ambos apuntan a la misma función, o ambos representan la misma dirección (3.9.2).

Si no tiene ningún puntero a las funciones, es posible que tengan la misma dirección, pero no lo sabríamos. Si son comparando punteros a dos funciones diferentes, no deben comparar igual.


Una causa de confusión podría ser que los compiladores de MSVC son conocidos para combinar código para funciones de plantilla que suceden para producir código de máquina idéntico para diferentes tipos (como int y long). Esto no es compatible.

Sin embargo, esto es para funciones con diferentes firmas, y no es exactamente de lo que se trata esta pregunta.

+0

El último comentario no tiene sentido ahora. Para diferentes tipos de argumentos, tiene punteros de función diferentes, por lo que la regla sobre "Dos punteros [de función] del mismo tipo" ya no se aplica. – MSalters

+0

Eso es verdad. Se trata más bien de un caso en el que hemos visto que diferentes funciones * pueden * obtener la misma dirección, pero no realmente de lo que se pregunta la pregunta, –

1

Detalles de implementación.

(C99, 5.1.2.3p1) "Las descripciones semánticas en esta norma internacional describen el comportamiento de una máquina abstracta en la que los problemas de optimización son irrelevantes".

+0

La cita es vacuamente cierta. La pregunta es acerca de un compilador real, que difiere de las máquinas abstractas, pero que (incluso en presencia de optimización) debe mostrar el mismo comportamiento observable que una de las máquinas abstractas permitidas. – MSalters

3

Sí. 6.5.10 C99: 6

Dos punteros comparan iguales si y sólo si ambos son punteros nulos, tanto son punteros a la misma objeto (incluyendo un puntero a un objeto y un subobjeto en su comenzando) o función, ...

Editar: el resto del párrafo, ya que resulta que tiene cierta importancia:

ambos son punteros a uno pasado el último elemento del mismo objeto matriz, o uno es un puntero a uno pasado el final de un objeto de matriz y el otro es un puntero al inicio de un objeto de matriz diferente que sucede que sigue inmediatamente el primer objeto de matriz en el espacio de direcciones .

Lo tomo de ella:

  • igualdad aplicado a los operandos equivocadas es, en pocas palabras, no especificados. Puede ser accidentalmente cierto por razones extrañas, pero no está indefinido cuando lo usa incorrectamente de la misma forma que < no está definido cuando lo usa incorrectamente.
  • a mi entender, el resto del párrafo no se aplica a las funciones, porque una función ni es un objeto ni puede ser un elemento de una matriz.
+0

Entonces, ¿no debería la implementación garantizar que son, en realidad, la misma función? Quiero decir, es bueno que los compiladores optimicen esto, pero las funciones de especificación de idioma me parecen diferentes que las funciones de ensamblaje posteriores a la compilación. –

+0

Tomado de la respuesta de Bo, la última parte es "o ambas representan las mismas direcciones". ¿Sería la última parte de esta cita similar? –

+0

@DanielSloof Creo que eso depende de lo que viene después del '...'. –

2

Muchos compiladores con optimizaciones activadas harán que dos funciones tengan la misma dirección. Por ejemplo, de msdn:

/OPT: ICF puede resultar en la misma dirección se asigna a diferentes funciones o sólo los miembros de datos leídos (variables const compilados con /Gy). Por lo tanto,/OPT: ICF puede interrumpir un programa que depende de la dirección de las funciones o de que los miembros de solo lectura sean diferentes. Consulte/Gy (habilite el enlace a nivel de función ) para obtener más información.

ICF: Idéntico plegado de código

Cuestiones relacionadas