resueltos programas programa principiantes para lenguaje funciones ejercicios ejemplos comandos codigos basicos avanzados c++ header backwards-compatibility function-overloading cmath

programas - Cuando el estándar de C++ proporciona encabezados C que traen nombres al espacio de nombres global, ¿eso incluye sobrecargas?



programa en c++ (1)

El borrador final del comité del próximo estándar C ++ 0x dice:

Cada encabezado C, cada uno de los cuales tiene un nombre del nombre de formulario.h, se comporta como si cada nombre colocado en el espacio de nombres de la biblioteca estándar por el encabezado cname correspondiente se ubica dentro del alcance del espacio de nombres global. No se especifica si estos nombres se declaran o definen por primera vez dentro del ámbito de espacio de nombres (3.3.6) del espacio de nombres estándar y luego se inyectan en el ámbito del espacio de nombres global mediante declaraciones de uso explícitas (7.3.3).

Los estándares anteriores de C ++ se leen de manera similar.

Mi pregunta es, cuando el encabezado de C ++ #include<cname> usa funciones sobrecargadas, ¿todas las sobrecargas son introducidas por #include<name.h> , ya que las sobrecargas no son "nombres" separados?

¿Y debería el comportamiento del siguiente código diferir entre compiladores C y C ++ que cumplen con las normas?

#include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double arg = -2.5; double result = abs(arg) / 3; printf("%f/n", result); return 0; }

Casos de prueba listos para compilar:

A partir de esta prueba, C ++ math.h actúa como C y no como C ++ cmath .

Pero en Visual C ++ 2010, C ++ math.h actúa como C ++ cmath .

Y un canario en tiempo de compilación para su uso con Comeau try-it-out :

#include<stdio.h> #include<stdlib.h> #include<math.h> template<typename T> struct typecheck {}; template<> struct typecheck<int> { enum { value = 1 }; }; template<typename T> typecheck<T> f(const T& t) { return typecheck<T>(); } int main(void) { double arg = -2.5; auto result = abs(arg) / 3; printf("%d/n", f(result).value); return 0; }

Resultado:

Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. All rights reserved. MODE:strict errors C++ C++0x_extensions "ComeauTest.c", line 15: error: class "typecheck<double>" has no member "value" printf("%d/n", f(result).value); ^ 1 error detected in the compilation of "ComeauTest.c".

Comeau está de acuerdo con Visual C ++.


Sí, todas las sobrecargas deberían incluirse en el espacio de nombres global. Tengo entendido que el encabezado math.h tiene el siguiente aspecto:

// math.h: #include <cmath> using std::abs; // etc.

Entonces, sí: el comportamiento de su programa de ejemplo es diferente cuando se compila como un programa C que cuando se compila como un programa C ++. Como programa C ++, llamará a std::abs(double) desde <math.h> . Como programa C, llamará a abs(int) desde <stdlib.h> (esta es la única función abs en la biblioteca estándar C, ya que C no admite la sobrecarga de funciones).