tutorial smart programar para inteligentes inteligente español ejemplos crear contratos contrato aprender c++ function-pointers overloading extern-c

c++ - smart - ¿Las funciones externas "C" son un tipo separado?



solidity español (3)

Del borrador de C ++ 11, 7.5 (párr. 1):

Dos tipos de funciones con vínculos de idioma diferentes son tipos distintos, incluso si son idénticos.

Así que puedo hacer una sobrecarga basada en enlaces de idioma:

extern "C" typedef void (*c_function)(); typedef void (*cpp_function)(); void call_fun(c_function f) { } void call_fun(cpp_function f) { } extern "C" void my_c() { } void my_cpp() { } int main() { call_fun(my_c); call_fun(my_cpp); }

Pero, con GCC 4.7.1, este código de ejemplo muestra los mensajes de error:

test.cpp: In function ''void call_fun(cpp_function)'': test.cpp:7:6: error: redefinition of ''void call_fun(cpp_function)'' test.cpp:4:6: error: ''void call_fun(c_function)'' previously defined here

Y con CLang ++:

test.cpp:7:6: error: redefinition of ''call_fun'' void call_fun(cpp_function f) ^ test.cpp:4:6: note: previous definition is here void call_fun(c_function f) ^

Ahora las preguntas:

  • ¿Mi comprensión de la norma es correcta? ¿Es este código válido?

  • ¿Alguien sabe si estos son errores en los compiladores o si lo están haciendo intencionalmente de esa manera por motivos de compatibilidad?


El código es claramente válido. G ++ (y un número de otros compiladores) son un poco laxos (por decirlo suavemente) sobre la integración del enlace en el tipo.


Es un error conocido en gcc, y registran que no es conforme ya que este error bloquea el error de uber, "C ++ 98 problemas de conformidad".

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2316

Compruebe la fecha de creación.

Hay una discusión hacia el final, sobre los aspectos prácticos de la introducción de una solución. Así que la respuesta a su última pregunta es "ambos": es un error y el error se ha dejado intencionalmente por compatibilidad.

Otros compiladores con el mismo problema podrían haber cometido el error de forma independiente, pero creo que es más probable que también sepan que está mal, pero quieren ser compatibles con los errores de gcc.


Por lo que vale, este código tampoco se compila con la configuración predeterminada en VS2012:

(8) error C2084: function ''void call_fun(c_function)'' already has a body (4) see previous definition of ''call_fun'' (19) error C3861: ''call_fun'': identifier not found (20) error C3861: ''call_fun'': identifier not found