Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

227
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda