Kode:
int main(void)
{
auto a=1;
return 0;
}
dikompilasi tanpa kesalahan oleh kompiler MS Visual Studio 2012, ketika file tersebut memiliki ekstensi .c. Saya selalu berpikir bahwa ketika Anda menggunakan ekstensi .c, kompilasi harus sesuai dengan sintaks C, dan bukan C ++. Selain itu, sejauh yang saya tahu otomatis tanpa jenis hanya diperbolehkan di C ++ sejak C ++ 11, di mana itu berarti bahwa jenis tersebut disimpulkan dari penginisialisasi.
Apakah itu berarti bahwa kompiler saya tidak menempel ke C, atau kode sebenarnya benar dalam bahasa C?
int
telah dihapus dari standar C pada tahun 1999.Jawaban:
auto
adalah kata kunci C lama yang berarti "ruang lingkup lokal".auto a
sama denganauto int a
, dan karena cakupan lokal adalah default untuk variabel yang dideklarasikan di dalam suatu fungsi, itu juga sama sepertiint a
dalam contoh ini.Kata kunci ini sebenarnya adalah sisa dari pendahulu C, di mana tidak ada tipe dasar: semuanya
int
, penunjukint
, arrayint
. (*) Deklarasi akan berupaauto
atauextrn
[sic]. C mewarisi "semuanyaint
" sebagai aturan default, jadi Anda bisa mendeklarasikan bilangan bulat denganISO C menyingkirkan ini, tetapi banyak kompiler masih menerimanya untuk kompatibilitas mundur. Jika tampaknya tidak dikenal, maka Anda harus menyadari bahwa aturan terkait sedang bekerja di
yang masih umum dalam kode modern.
C ++ 11 menggunakan kembali kata kunci, yang hanya sedikit jika ada programmer C ++ yang menggunakan makna aslinya, untuk inferensi tipenya. Ini sebagian besar aman karena aturan "semuanya
int
" dari C sudah dijatuhkan di C ++ 98; satu-satunya hal yang rusak adalahauto T a
, yang tidak ada yang menggunakan pula. (Di suatu tempat di makalahnya tentang sejarah bahasa , Stroustrup berkomentar tentang ini, tapi saya tidak dapat menemukan referensi yang tepat sekarang.)(*) Penanganan string dalam B menarik: Anda akan menggunakan array
int
dan mengemas beberapa karakter di setiap anggota. B sebenarnya BCPL dengan sintaks yang berbeda.sumber
-Werror
.Ini adalah jawaban dan komentar tambahan untuk Tidak, ini bukan C hukum sejak 1999. Tidak ada kompiler C modern yang layak memungkinkan untuk ini.
Ya,
auto a=1;
ilegal di C1999 (dan juga C2011). Hanya karena ini sekarang ilegal tidak berarti bahwa kompiler C modern harus menolak kode yang mengandung konstruksi tersebut. Saya berpendapat sebaliknya, bahwa kompiler C modern yang layak masih harus memungkinkan untuk ini.Baik dentang dan gcc melakukan hal itu ketika mengkompilasi kode sampel dalam pertanyaan terhadap versi 1999 atau 2011 standar. Kedua penyusun mengeluarkan diagnostik dan kemudian melanjutkan seolah-olah pernyataan keberatan telah
auto int a=1;
.Menurut pendapat saya, inilah yang harus dilakukan oleh kompiler yang layak. Dengan mengeluarkan diagnostik, dentang dan gcc sepenuhnya sesuai dengan standar. Standar tidak mengatakan bahwa kompilator harus menolak kode ilegal. Standar hanya mengatakan bahwa implementasi yang sesuai harus menghasilkan setidaknya satu pesan diagnostik jika unit terjemahan berisi pelanggaran terhadap aturan atau batasan sintaksis apapun (5.1.1.3).
Kode yang diberikan yang mengandung konstruksi ilegal, setiap kompiler yang layak akan mencoba memahami kode ilegal sehingga kompiler dapat menemukan kesalahan berikutnya dalam kode. Kompiler yang berhenti pada kesalahan pertama bukanlah kompiler yang sangat baik. Ada cara untuk masuk akal
auto a=1
, yaitu menerapkan aturan "int implisit". Aturan ini memaksa kompiler untuk menginterpretasikanauto a=1
seolah-olahauto int a=1
ketika kompiler digunakan dalam mode C90 atau K&R.Sebagian besar kompiler biasanya menolak kode (tolak: menolak untuk membuat file objek atau file yang dapat dieksekusi) yang berisi sintaksis ilegal. Ini adalah kasus di mana penulis kompiler memutuskan bahwa gagal mengkompilasi bukan pilihan terbaik. Hal terbaik untuk dilakukan adalah mengeluarkan diagnostik, memperbaiki kode, dan melanjutkan. Terlalu banyak kode lawas yang dibumbui dengan konstruksi seperti
register a=1;
. Kompiler harus dapat mengkompilasi kode itu dalam mode C99 atau C11 (dengan diagnostik, tentu saja).sumber
-ffs-please-stop-allowing-constructs-from-some-previous-millennium
opsi kompiler, atau lebih tepatnya,-fstrict-compliance
opsi. Menggerutu pada kompiler: "Ketika saya menggunakan -std = c11, saya tidak berharap bahwa kruft K&R kuno untuk dikompilasi. Bahkan, saya ingin itu tidak dikompilasi!"-std=c99
menjadi lebih ketat akan menjadi langkah ke arah yang benar :)gcc -g -O3 -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror
(yang saya gunakan secara rutin, bahkan pada kode dari pertanyaan pada SO), maka Anda mendapatkan cukup dekat dengan apa yang Anda inginkan. Saya ingin GCC default ke setidaknya-std=c99
dan lebih disukai-std=c11
(atau,-std=gnu11
mereka lebih cenderung melakukan itu), tetapi sampai saat itu, ... Anda dapat mengubah opsi tersebut;-pedantic
,-Wshadow
,-Wold-style-declaration
Dan beberapa orang lain dapat berguna, tapi ini adalah awal yang baik mengatur pilihan.-pedantic-errors
auto
memiliki makna di dalamC
danC++
sebelum Standar 2011. Ini berarti bahwa variabel memiliki masa pakai otomatis, yaitu, masa pakai yang ditentukan oleh cakupan . Ini bertentangan dengan, misalnya,static
seumur hidup, di mana variabel berlangsung "selamanya", terlepas dari ruang lingkupnya.auto
adalah masa hidup standar, dan hampir tidak pernah dieja secara eksplisit. Inilah sebabnya mengapa aman untuk mengubah artinyaC++
.Sekarang
C
, sebelum Standar 99, jika Anda tidak menentukan jenis variabel, standarnya adalahint
.Jadi dengan
auto a = 1;
Anda mendeklarasikan (dan mendefinisikan) suatuint
variabel, dengan masa pakai ditentukan oleh cakupan.("Seumur hidup" lebih tepat disebut "durasi penyimpanan", tapi saya pikir itu mungkin kurang jelas).
sumber
main
fungsi".auto
danstatic
hanya dua kemungkinan. Saya mencoba untuk menulis jawaban saya dengan cara yang ditargetkan pada penanya, yang tampaknya cukup baru untukC++
(danC
), jadi saya sedikit menyelimuti detailnya. Mungkin itu ide yang buruk; mereka perlu ditutup cepat atau lambat.int
ini dihapus dari C sejak 1999.Dalam C, dan dialek historis C ++,
auto
adalah makna kata kunci yanga
memiliki penyimpanan otomatis. Karena hanya dapat diterapkan ke variabel lokal, yang otomatis secara default, tidak ada yang menggunakannya; itulah sebabnya C ++ kini telah menggunakan kembali kata kunci.Secara historis, C telah memungkinkan deklarasi variabel tanpa specifier tipe; tipe default untuk
int
. Jadi deklarasi ini setara denganSaya pikir ini sudah usang (dan mungkin dilarang) dalam C modern; tetapi beberapa kompiler populer default ke C90 (yang, saya pikir, mengizinkannya), dan, yang mengganggu, hanya mengaktifkan peringatan jika Anda secara spesifik memintanya. Mengkompilasi dengan GCC dan menentukan C99 dengan
-std=c99
, atau mengaktifkan peringatan dengan-Wall
atau-Wimplicit-int
, memberikan peringatan:sumber
Dalam C,
auto
berarti hal yang samaregister
tidak di C ++ 11: itu berarti bahwa suatu variabel memiliki durasi penyimpanan otomatis.Dan di C sebelum C99 (dan kompiler Microsoft tidak mendukung C99 atau C11, meskipun mungkin mendukung bagian-bagian itu), tipe ini dapat dihilangkan dalam banyak kasus, di mana ia akan default
int
.Tidak mengambil tipe dari initialiser sama sekali. Anda baru saja memilih penginisialisasi yang kompatibel.
sumber
auto
danregister
memiliki arti yang sama persis (saya sebelumnya berkomentar bahwa ada batasan untuk mengambilregister
alamat variabel-kualifikasi, tapi itu tidak benar untuk C ++).register
, sementara sudah tidak digunakan lagi, tetap mempertahankan makna lamanya untuk saat ini.auto
di C berarti sama denganregister
di C ++, yang artinya (keduanya berarti durasi penyimpanan otomatis, dan tidak ada yang lain).Jenis kompilasi studio visual tersedia di
right click on file -> Properties -> C/C++ -> Advanced -> Compile As
. Untuk memastikan itu dikompilasi sebagai/TC
opsi C force. Maka dalam hal ini adalah apa yang dikatakan larsmans (auto
kata kunci C lama ). Mungkin dikompilasi sebagai C ++ tanpa Anda sadari.sumber
Kelas penyimpanan mendefinisikan ruang lingkup (visibilitas) dan masa hidup variabel dan / atau fungsi dalam Program C.
Ada kelas penyimpanan berikut yang dapat digunakan dalam Program C.
auto
adalah kelas penyimpanan default untuk semua variabel lokal.Contoh di atas mendefinisikan dua variabel dengan kelas penyimpanan yang sama. otomatis hanya dapat digunakan dalam fungsi, yaitu variabel lokal.
int
adalah tipe default untukauto
kode di bawah ini:Kode di bawah ini juga legal:
sumber