В окончательном проекте комитета предстоящего стандарта C ++ 0x говорится:
Каждый заголовок C, каждый из которых имеет имя формы name.h, ведет себя так, как если бы каждое имя, помещенное в пространство имен стандартной библиотеки соответствующим заголовком cname, помещалось в область глобального пространства имен. Не указано, были ли эти имена сначала объявлены или определены в области видимости пространства имен (3.3.6) пространства имен std, а затем введены в глобальную область пространства имен явными объявлениями using (7.3.3).
Аналогичным образом читались и более ранние стандарты C ++.
Мой вопрос: когда заголовок C ++ #include<cname>
использует перегруженные функции, все ли перегрузки вносятся #include<name.h>
, поскольку перегрузки не являются отдельными «именами»?
И должно ли поведение следующего кода различаться между совместимыми со стандартами компиляторами C и C ++?
#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;
}
Готовые к компиляции тестовые примеры:
- C ++
math.h
иstdlib.h
: http://ideone.com/pmD4t - C
math.h
иstdlib.h
: http://ideone.com/Sflpn - C ++
cmath
иcstdlib
: http://ideone.com/yI07m - Только C ++
cmath
: http://ideone.com/KrS3W
Судя по этому тесту, C ++ math.h
действует как C, а не как C ++ cmath
.
Но в Visual C ++ 2010 C ++ math.h
действует как C ++ cmath
.
И канарейка времени компиляции для использования с 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;
}
Результат:
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".
Комо согласен с Visual C ++.
auto
. Это очень полезно знать. Я думаю, вы также можете протестировать это, просто не включая<stdio.h>
.<math.h>
должен включатьabs
только в C ++, но не в C. - person James McNellis   schedule 10.12.2010stdlib.h
, а неstdio.h
. Я столкнулся с этим при разработке примера, на ideone (gcc-4.3.4) версия C ++ только сmath.h
не компилировалась. - person Ben Voigt   schedule 10.12.2010<stdlib.h>
. - person James McNellis   schedule 10.12.2010