C agak, tidak persis, bagian dari C ++. Jadi kita dapat menggunakan sebagian besar fungsi / header C di C ++ dengan mengubah nama sedikit ( stdio.h
menjadi cstdio
, stdlib.h
menjadi cstdlib
).
Pertanyaan saya sebenarnya semacam semantik. Dalam kode C ++ (menggunakan versi terbaru dari kompiler GCC), saya dapat memanggil printf("Hello world!");
dan std::printf("Hello world!");
bekerja persis sama. Dan dalam referensi yang saya gunakan juga muncul sebagai std::printf("Hello world!");
.
Pertanyaan saya adalah, apakah ini lebih disukai untuk digunakan std::printf();
dalam C ++? Apakah ada bedanya?
c++
language-lawyer
std
DeiDei
sumber
sumber
C
simbol perpustakaan ke namespace global menjadi ilegal, saya lebih suka menggunakanstd::
versi yang memenuhi syarat. (Ditambah saya agak berharap mereka membuatnya ilegal).Jawaban:
Dari C ++ 11 Standard (penekanan saya):
Menggunakan header «name.h» tidak digunakan lagi, header tersebut telah diidentifikasi sebagai kandidat untuk dihapus dari revisi mendatang.
Jadi, saya akan menyarankan untuk memasukkan header «cname» dan menggunakan deklarasi dan definisi dari
std
namespace.Jika Anda harus menggunakan header «name.h» karena beberapa alasan (sudah usang, lihat di atas), saya akan menyarankan untuk menggunakan deklarasi dan definisi dari namespace global.
Dengan kata lain: lebih memilih
lebih
sumber
<cmeow>
selalu menyediakan::std::purr
dan mungkin atau mungkin tidak menyediakan::purr
.<meow.h>
selalu menyediakan::purr
dan mungkin atau mungkin tidak menyediakan::std::purr
.Gunakan formulir yang dijamin disediakan oleh tajuk yang Anda sertakan.
sumber
<cmeow>
atau<meow.h>
tidak memberikan::std::purr
atau::purr
melainkan kesalahan pra-prosesor. Hanya<cstdio>
dan / atau<stdio.h>
menyediakan::std::printf
dan / atau::printf
. : Pstrcat
membuat::purr
.Tidak, kamu baik-baik saja.
The original intent adalah bahwa
<___.h>
header akan menjadi C versi yang meletakkan segala sesuatu dalam namespace global, dan<c___>
header akan menjadi C ++ - versi ified, yang tempat segala sesuatu distd
namespace.Dalam praktiknya, versi C ++ juga memasukkan semuanya ke dalam namespace global. Dan tidak ada konsensus yang jelas bahwa menggunakan
std::
versi adalah "hal yang benar untuk dilakukan".Jadi pada dasarnya, gunakan mana saja yang Anda suka. Yang paling umum mungkin adalah menggunakan fungsi pustaka standar C di namespace global (
printf
bukanstd::printf
), tetapi tidak banyak alasan untuk menganggap satu "lebih baik" daripada yang lain.sumber
Satu-satunya perbedaan adalah
std::printf()
dengan menambahkanstd::
resolusi cakupan, Anda akan mengamankan diri Anda sendiri dari seseorang yang menulis fungsi dengan nama yang sama di masa mendatang, yang akan menyebabkan konflik namespace. Kedua penggunaan tersebut akan menghasilkan panggilan API OS yang sama persis (Anda dapat memeriksanya di Linux dengan menjalankannyastrace your_program
).Saya merasa sangat tidak mungkin seseorang akan menamai fungsi seperti itu, seperti
printf()
salah satu fungsi yang paling umum digunakan di luar sana. Juga, di C ++,iostream
s lebih diutamakan daripada panggilan kecstdio
fungsi seperti printf.sumber
printf
sangat rusak di C ++ karena kurangnya pengetikan yang kuat, menggantinya dengan versi yang lebih baik cukup alami.std::printf
berbeda darimynamespace::printf
, dan C ++ secara eksplisit mengizinkan saya untuk mendefinisikan fungsi saya sendiri yang namanya membayangi mereka dari fungsi di dalamnyastd
. Itu tidak bisa diperdebatkan. Adapun klaim Anda yangprintf
efisien karena mengetik longgar, itu tentu juga salah.printf
bahkan tidak terlalu efisien, ada banyak implementasi yang lebih efisien yang sangat diketik.Dari standar C ++ 11:
Jadi, jika Anda menggunakan
<cstdio>
, Anda bisa yakin, ituprintf
akan ada dinamespace std
, dan karenanya tidak di namespace global.Menggunakan namespace global menciptakan konflik nama. Ini bukan cara C ++.
Oleh karena itu, saya menggunakan
<cstdio>
header dan menyarankan Anda untuk melakukannya.sumber
<cstdio>
Anda dijamin bahwa std :: printf akan ada, tetapi tidak ada jaminan dari standar if :: printf akan ada atau tidak juga. Bahkan, di setiap compiler yang pernah saya dengar dari :: printf adalah disuntikkan ke dalam namespace global bila Anda termasuk<cstdio>
.Dari praktik saya sendiri: gunakan
std::
prefiks. Jika tidak, suatu hariabs
nanti menggigit Anda dengan sangat menyakitkan jika Anda menggunakan floating point.Tidak memenuhi syarat
abs
mengacu pada fungsi yang ditentukanint
di beberapa platform. Pada orang lain itu kelebihan beban. Namunstd::abs
selalu kelebihan beban untuk semua tipe.sumber
Menggunakan hanya
printf
tanpastd::
dapat menghasilkan beberapa konflik nama dan dianggap sebagai praktik yang buruk oleh banyak c ++ dev. Google adalah teman Anda yang satu ini, tetapi ini ada beberapa tautan, semoga ini membantuMengapa "menggunakan namespace std" dianggap praktik yang buruk? http://www.cplusplus.com/forum/beginner/61121/
sumber
using namespace std
adalah praktik yang buruk, tetapi menggunakanprintf
tanpastd::
kualifikasi tidak.using namespace std;
bukan masalah saya di sini. Saya tidak pernah menggunakannya.printf();
danstd::printf();
bekerja di C ++ tanpausing namespace std;
Itu sebabnya saya memposting pertanyaan.std::printf
karena rasanya sangat aneh.Di stdio
Jadi seharusnya tidak ada bedanya.
sumber