Tengo un *.cpp
archivo que compilo con C ++ (no un compilador de C). La función que contiene se basa en una conversión (vea la última línea) que parece estar definida en C (¡corrija si estoy equivocado!), Pero no en C ++ para este tipo especial.
[...] C++ code [...]
struct sockaddr_in sa = {0};
int sockfd = ...;
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
bind(sockfd, (struct sockaddr *)&sa, sizeof sa);
[...] C++ code [...]
Dado que compilo esto en un archivo C ++, ¿es este un comportamiento ahora definido o indefinido? ¿O necesitaría mover esto a un *.c
archivo para definir su comportamiento?
c++
c
undefined-behavior
Daniel Stephens
fuente
fuente
.c
extensión, el compilador de C se invoca automáticamente.Respuestas:
Esto se define tanto en C ++ como en C. No viola las estrictas regulaciones de alias ya que no desreferencia el puntero resultante.
Aquí está la cita de C ++ (gracias a @interjay y @VTT) que permite esto:
Aquí está la cita de C (gracias @StoryTeller) que permite esto:
Estos especifican que un tipo de puntero se puede convertir a otro tipo de puntero (y luego, opcionalmente, volver a convertir) sin consecuencias.
Y aquí está la cita de POSIX que permite este caso específico:
Como esta función (
bind
) es parte de la biblioteca estándar de C, lo que sea que ocurra dentro (específicamente, desreferenciar el puntero con tipo de letra) no tiene un comportamiento indefinido.Para responder a la pregunta más general:
C y C ++ son dos lenguajes diferentes. Si algo se define en C pero no en C ++, se define en C pero no en C ++. Ninguna compatibilidad implícita entre los dos idiomas cambiará eso. Si desea utilizar código bien definido en C pero indefinido en C ++, deberá utilizar un compilador de C para compilar ese código.
fuente
bind
debe ser aconst void *
, perobind
es anterior a la existencia delvoid
lenguaje C (y la existencia de C ++). Lo actualizaron en algún momento para agregarconst
, pero nunca arreglaron el tipo básico.Todas las llamadas entre código C y C ++ invocan Comportamiento indefinido, desde el punto de vista de los estándares respectivos, pero la mayoría de las plataformas especifican tales cosas.
En situaciones en las que partes del Estándar C o C ++ y la documentación de una implementación definen o describen conjuntamente una acción, pero otras partes la caracterizan como Indefinida, las implementaciones pueden procesar código de la manera que mejor satisfaga las necesidades de sus clientes o, si son indiferentes a las necesidades del cliente, sea cual sea la moda que consideren adecuada. El hecho de que el Estándar considere tales asuntos como ajenos a su jurisdicción no implica ningún juicio sobre cuándo y / o cómo las implementaciones que afirman su idoneidad para diversos fines deben procesarlos de manera significativa, pero algunos encargados de la compilación suscriben un mito que sí lo hace.
fuente