Newsgroup: it.comp.lang.c++
Titolo: cmath e namespace

Ciao. Non mi è chiara una cosa nel seguente programma di esempio:
#include <iostream>
#include <cmath>
using std::cout;
using std::endl;
using std::sqrt;
int main()
{
	cout << sqrt(2) << "   " << cos(45 * 3.1415 / 180) << endl;
}
La funzione cos() non dovrebbe essere definita nel namespace std?
Questo programma invece funziona ugualmente perchè?.
Quale forma devo usare: dichiarare using come per sqrt() oppure no?.
Grazie.

Quale forma devo usare: dichiarare using come per sqrt() oppure no?.
A me compila anche senza using::sqrt;
Credo che sqrt, cos e altre funzioni siano definite fuori da sdt e che però 
all'interno di std siano state dichiarate. In tal modo compila sia 
richiamandole da std (con std::sqrt per dire) che usandole direttamente 
(come hai fatto con cos).
Ciao 

 ha scritto:

No. Formalmente il programma dell'esempio e' errato. Avevo pero' letto
da qualche parte un commento di Bill Plauger, l'autore delle librerie
Dinkumware, secondo il quale e' praticamente impossibile scrivere un
sistema di header integrati che rispettino appieno le regole del C e
del C++.
Ciao,
Nicola

 del C++.
Ho aspettato a rispondere, perche' non sono sicuro di quello che dico.
Non mi e' chiaro se nello standard si dice che:
a) tutte le funzioni definite negli header <c...> sono in std::;
b) tutte le funzioni definite negli header <c...> sono *anche* in std:: 
(oltre che in ::).
Confermi che quella giusta e' la a)?
Di fatto la maggior parte dei compilatori funziona come in b), ma per 
stare sul sicuro io scriverei come se fosse a).
  bye
	av.

 Confermi che quella giusta e' la a)?
Si. La libreria C++ standard definisce i nomi della libreria C nel
namespace std, salvo quei nomi che in C sono specificati come macro.
L'effetto di includere uno header del C, ovvero nella forma nome.h,
equivale a includere il corrispondente header del C++, ovvero cnome,
seguito da una dichiarazione using nel namespace globale per ciascun
nome definito dallo header nel namespace std.
Ciao,
Nicola

Ringrazio tutti per le risposte.
Il fatto è che prima di scrivervi ho cercato un pò di info nel web tra
manuali e codici sorgente.
Tralasciando quelli che usavano
#include <math.h>
coloro che utilizzavano <cmath> adottavano o la forma using::  oppure
usavano le funzioni matematiche senza tale dichiarazione. Pertanto non
capivo quale forma era più corretta.
Ciao e grazie ancora.

 namespace std, salvo quei nomi che in C sono specificati come macro.
E questo potrebbe essere un problema non da poco, in effetti.
IMHO non c'è scritto da nessuna parte che una data funzione non debba
essere una macro. O sono fuori strada?
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.

 essere una macro. O sono fuori strada?
Io però immaginavo che le librerie C del C++ (tipo <cmath>) 
rimpiazzassero tutte le macro con delle funzioni inline... non sarebbe 
naturale?
E.

 essere una macro. O sono fuori strada?
Sei fuori strada. Lo standard del C specifica alcune entita' come
macro, ma lascia la liberta' di implementarle come funzioni. Lo
standard del C++ invece specifica che *devono* essere implementate
come macro.
Ciao,
Nicola

 come macro.
uhm. capisco.
