Eu tenho um *.cpp
arquivo que eu compilar com C ++ (não um compilador C). A função contendo depende de uma conversão (consulte a última linha) que parece ser definida em C (corrija se estiver errado!), Mas não em 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 [...]
Desde que eu compilo isso em um arquivo C ++, isso agora é um comportamento definido ou indefinido? Ou eu precisaria mover isso para um *.c
arquivo, para torná-lo um comportamento definido?
c++
c
undefined-behavior
Daniel Stephens
fonte
fonte
.c
extensão, o compilador C é chamado automaticamente.Respostas:
Isso é definido em C ++ e C. Ele não viola os regulamentos estritos de alias, pois não desrefere o ponteiro resultante.
Aqui está a citação do C ++ (graças a @interjay e @VTT) que permite isso:
Aqui está a citação de C (obrigado @StoryTeller) que permite isso:
Eles especificam que um tipo de ponteiro pode ser convertido em outro tipo de ponteiro (e opcionalmente convertido de volta) sem conseqüências.
E aqui está a citação do POSIX que permite este caso específico:
Como essa função (
bind
) faz parte da biblioteca padrão C, o que quer que ocorra dentro (especificamente, desreferenciando o ponteiro de conversão de tipo) não possui um comportamento indefinido.Para responder à pergunta mais geral:
C e C ++ são duas linguagens diferentes. Se algo é definido em C, mas não em C ++, é definido em C, mas não em C ++. Nenhuma compatibilidade implícita entre os dois idiomas mudará isso. Se você deseja usar código bem definido em C, mas não definido em C ++, será necessário usar um compilador C para compilar esse código.
fonte
bind
deve ser aconst void *
, masbind
antecede a existência davoid
linguagem C (e a existência de C ++). Eles o atualizaram em algum momento para adicionar oconst
, mas nunca corrigiram o tipo básico.Todas as chamadas entre códigos C e C ++ invocam o comportamento indefinido, do ponto de vista dos respectivos padrões, mas a maioria das plataformas especifica essas coisas.
Em situações em que partes do padrão C ou C ++ e a documentação de uma implementação definem ou descrevem uma ação juntas, mas outras partes a caracterizam como Indefinida, as implementações têm permissão para processar código da maneira que melhor atenda às necessidades de seus clientes ou - se eles são indiferentes às necessidades dos clientes - da maneira que acharem melhor. O fato de a Norma considerar assuntos fora de sua jurisdição não implica julgamento sobre quando e / ou como as implementações que reivindicam adequação para vários propósitos devem processá-las de maneira significativa, mas alguns mantenedores do compilador subscrevem o mito de que são.
fonte