C é, de certa forma, não exatamente, um subconjunto de C ++. Portanto, podemos usar a maioria das funções / cabeçalhos C em C ++ mudando um pouco o nome ( stdio.h
para cstdio
, stdlib.h
para cstdlib
).
Minha pergunta é meio semântica. No código C ++ (usando a versão mais recente do compilador GCC), posso chamar printf("Hello world!");
e std::printf("Hello world!");
funciona exatamente da mesma forma. E na referência que estou usando, também aparece como std::printf("Hello world!");
.
Minha pergunta é: é preferível usar std::printf();
em C ++? Existe alguma diferença?
c++
language-lawyer
std
DeiDei
fonte
fonte
C
símbolos de biblioteca no namespace global seja ilegal, eu prefiro usar asstd::
versões qualificadas. (Além disso, eu meio que gostaria que eles tivessem tornado isso ilegal).Respostas:
Do C ++ 11 Standard (ênfase minha):
Usar os cabeçalhos «name.h» está obsoleto, eles foram identificados como candidatos para remoção de revisões futuras.
Então, eu sugeriria incluir os cabeçalhos «cname» e usar as declarações e definições do
std
namespace.Se você tiver que usar os cabeçalhos «name.h» por alguns motivos (está obsoleto, veja acima), eu sugeriria usar as declarações e definições do namespace global.
Em outras palavras: prefira
sobre
fonte
<cmeow>
sempre fornece::std::purr
e pode ou não fornecer::purr
.<meow.h>
sempre fornece::purr
e pode ou não fornecer::std::purr
.Use o formulário que com certeza será fornecido pelo cabeçalho que você incluir.
fonte
<cmeow>
nem<meow.h>
fornece nem::std::purr
nem::purr
, mas sim um erro de pré-processador. Apenas<cstdio>
e / ou<stdio.h>
fornece::std::printf
e / ou::printf
. : Pstrcat
produzir::purr
.Não, você está bem de qualquer maneira.
A intenção original era que os
<___.h>
cabeçalhos fossem as versões C que colocam tudo no namespace global, e os<c___>
cabeçalhos seriam as versões C ++ ified, que colocam tudo nostd
namespace.Na prática, porém, as versões C ++ também colocam tudo no namespace global. E não há um consenso claro de que usar as
std::
versões é "a coisa certa a fazer".Então, basicamente, use o que você preferir. O mais comum é provavelmente usar as funções da biblioteca padrão C no namespace global (em
printf
vez destd::printf
), mas não há muitos motivos para considerar uma "melhor" que a outra.fonte
A única diferença é que,
std::printf()
ao adicionarstd::
resolução de escopo, você se protegerá de alguém que escreva uma função com o mesmo nome no futuro, o que levaria a um conflito de espaço de nomes. Ambos os usos levarão exatamente às mesmas chamadas de API do sistema operacional (você pode verificar no Linux executandostrace your_program
).Acho muito improvável que alguém nomeie uma função assim, pois
printf()
é uma das funções mais comumente usadas por aí. Além disso, em C ++,iostream
s são preferidos a chamadas decstdio
funções como printf.fonte
printf
está gravemente quebrado em C ++ devido à sua falta de tipagem forte, substituí-lo por uma versão melhor é bastante natural.std::printf
é diferente demynamespace::printf
, e C ++ me permite explicitamente definir minhas próprias funções cujos nomes sombreiam as funções internasstd
. Isso simplesmente não é discutível. Quanto às suas afirmações queprintf
são eficientes por causa da digitação solta, isso também está errado.printf
nem mesmo é particularmente eficiente, existem muitas implementações mais eficientes que são fortemente tipadas.Do padrão C ++ 11:
Portanto, se você usar
<cstdio>
, pode ter certeza de queprintf
estará nonamespace std
e, portanto, não no namespace global.Usar um namespace global cria um conflito de nomes. Este não é o método C ++.
Portanto, estou usando
<cstdio>
cabeçalhos e aconselho você a fazer isso.fonte
<cstdio>
terá a garantia de que std :: printf existirá, mas não há garantia do padrão se :: printf existirá ou não também. Na verdade, em cada compilador que eu já ouvi falar, :: printf é injetado no namespace global quando você inclui<cstdio>
.Da minha própria prática: use
std::
prefixos. Caso contrário, um diaabs
vai te morder muito dolorosamente no caso de você usar pontos flutuantes.Não qualificado
abs
refere - se à função definidaint
em algumas plataformas. Em outros, está sobrecarregado. No entanto,std::abs
está sempre sobrecarregado para todos os tipos.fonte
Usar apenas
printf
semstd::
pode gerar alguns conflitos de nome e é considerado uma prática ruim por muitos desenvolvedores de c ++. O Google é seu amigo nisso, mas aqui estão alguns links, espero que isso ajudePor que "usar o namespace std" é considerado uma prática ruim? http://www.cplusplus.com/forum/beginner/61121/
fonte
using namespace std
é uma prática ruim, mas usarprintf
semstd::
qualificador não é.using namespace std;
não é meu problema aqui. Eu nunca uso isso.printf();
estd::printf();
trabalhar em C ++ semusing namespace std;
É por isso que postei a pergunta.std::printf
isso parece simplesmente estranho.Em stdio
Portanto, não deve fazer nenhuma diferença.
fonte