Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

230
Visualizações
¿Los símbolos de la biblioteca estándar de C están reservados en C++?

Esta es una continuación de una pregunta diferente.

La pregunta original tenía otros problemas, pero tuve que darme cuenta de que el principal (según CLang) era una redefinición del time como un símbolo diferente, mientras que solo se usaban bonitas inclusiones de C++.

Así que aquí hay una versión simplificada:

 #include<iostream> using std::cout; using std::endl; class time { public: int h, min, sec; }; const int full = 60; void canonify(time& pre) // Error here (line 14) { pre.min += pre.sec / full; pre.h += pre.min / full; pre.sec %= full; pre.min %= full; } int main() { time a; // and here (line 23) ah = 3; a.min = 128; a.sec = 70; canonify(a); cout << ah << ":" << a.min << ":" << a.sec << endl; }

Por supuesto, reemplazar el time con un símbolo diferente o usar struct time es suficiente para deshacerse del problema. Dicho de otra manera, mi pregunta no es cómo hacer que se ejecute el código, sino solo si tenemos que ver los símbolos de la biblioteca C como tokens reservados en C++. Clang 11 (en MSVC19) se ahoga con:

 1>ess.cpp(14,15): error : must use 'class' tag to refer to type 'time' in this scope 1>...\ucrt\time.h(518,42): message : class 'time' is hidden by a non-type declaration of 'time' here 1>ess.cpp(23,5): error : must use 'class' tag to refer to type 'time' in this scope 1>...\ucrt\time.h(518,42): message : class 'time' is hidden by a non-type declaration of 'time' here

Entonces, la pregunta es: ¿dónde prohíbe el estándar C ++ usar libremente símbolos de la biblioteca estándar C cuando no están incluidos explícitamente en una unidad de compilación?


Curiosamente, el mismo código (una vez traducido...) funciona bien en C:

 #include <stdio.h> // typedef struct { int h, min, sec; }time; // const int full = 60; // void canonify(time* pre) { pre->min += pre->sec / full; pre->h += pre->min / full; pre->sec %= full; pre->min %= full; } int main() { time a; ah = 3; a.min = 128; a.sec = 70; canonify(&a); printf("%d:%d:%d\n", ah, a.min, a.sec); return 0; }
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

¿Dónde prohíbe el estándar C++ usar libremente símbolos de la biblioteca estándar de C?

Último borrador:

[nombres.externos]

Cada nombre de la biblioteca estándar C declarada con enlace externo está reservado para la implementación para su uso como un nombre con enlace "C" externo, tanto en el espacio de nombres estándar como en el espacio de nombres global.

Cada firma de función de la biblioteca estándar de C declarada con enlace externo está reservada para la implementación para su uso como una firma de función con enlace externo "C" y externo "C++", o como un nombre de ámbito de espacio de nombres en el espacio de nombres global.


cuando no se incluyen explícitamente en una unidad de compilación?

Si utiliza la biblioteca estándar, todas las reservas de nombres de la biblioteca estándar estarán en vigor.

Si incluye cualquier encabezado estándar (o cualquier encabezado cuyo contenido exacto no controle y, por lo tanto, puede incluir encabezados estándar), entonces puede incluir indirectamente otros encabezados estándar, incluidos los heredados de C.

over 4 years ago · Santiago Trujillo Relatório

0

[nombres.externos]

3 Cada nombre de la biblioteca estándar C declarada con enlace externo está reservado para la implementación para su uso como un nombre con enlace "C" externo, tanto en el espacio de nombres estándar como en el espacio de nombres global.

Tenga en cuenta que este párrafo se reserva el nombre en sí. Por lo tanto, crear un alias de time en el espacio de nombres global viola este contrato.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda