Apa alasan untuk peringatan berikut di beberapa kompiler C ++?
Tidak ada baris baru di akhir file
Mengapa saya harus memiliki baris kosong di akhir file sumber / header?
c++
compiler-construction
warnings
c-preprocessor
Brian Tompsett - 汤 莱恩
sumber
sumber
cat
memiliki file dan tidak memiliki baris tambahan karena prompt shell baru akan muncul setelah baris terakhir file (yaitu tidak di kolom 0)Why should I have an empty line at the end of a source/header file
- Jika file teks berisione\ntwo\nthree\n
maka berisi tiga baris, tidak ada yang kosong. Jika file teks berisione\ntwo\nthree
maka itu bukan file teks, dalam arti yang sama bahwa kalimat tanpa berhenti pada akhirnya bukanlah sebuah kalimat.Jawaban:
Pikirkan beberapa masalah yang dapat terjadi jika tidak ada baris baru. Menurut standar ANSI,
#include
file di awal memasukkan file persis seperti di depan file dan tidak menyisipkan baris baru setelah#include <foo.h>
setelah isi file. Jadi jika Anda memasukkan file tanpa baris baru di akhir parser itu akan dilihat seolah-olah baris terakhirfoo.h
berada di baris yang sama dengan baris pertamafoo.cpp
. Bagaimana jika baris terakhir foo.h adalah komentar tanpa baris baru? Sekarang baris pertamafoo.cpp
dikomentari. Ini hanya beberapa contoh dari jenis masalah yang dapat merambah.Hanya ingin menunjukkan pihak yang tertarik pada jawaban James di bawah ini. Sementara jawaban di atas masih benar untuk C, standar C ++ yang baru (C ++ 11) telah diubah sehingga peringatan ini seharusnya tidak lagi dikeluarkan jika menggunakan C ++ dan kompiler yang sesuai dengan C ++ 11.
Dari standar C ++ 11 melalui pos James:
sumber
Persyaratan bahwa setiap file sumber berakhir dengan baris baru yang tidak terhapus telah dihapus dalam C ++ 11. Spesifikasi sekarang berbunyi:
Compiler yang menyesuaikan seharusnya tidak lagi mengeluarkan peringatan ini (setidaknya tidak ketika mengkompilasi dalam mode C ++ 11, jika kompiler memiliki mode untuk revisi yang berbeda dari spesifikasi bahasa).
sumber
C ++ 03 Standard [2.1.1.2] menyatakan:
sumber
Jawaban untuk "patuh" adalah "karena Standar C ++ 03 mengatakan perilaku suatu program yang tidak berakhir pada baris baru tidak ditentukan" (diparafrasekan).
Jawaban bagi yang penasaran ada di sini: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html .
sumber
Itu tidak merujuk ke baris kosong, itu adalah apakah baris terakhir (yang dapat memiliki konten di dalamnya) diakhiri dengan baris baru.
Sebagian besar editor teks akan meletakkan baris baru di akhir baris terakhir file, jadi jika baris terakhir tidak memilikinya, ada risiko file tersebut telah terpotong. Namun, ada alasan yang sah mengapa Anda mungkin tidak ingin baris baru jadi itu hanya peringatan, bukan kesalahan.
sumber
#include
akan mengganti barisnya dengan konten literal dari file tersebut. Jika file tidak diakhiri dengan baris baru, baris berisi#include
yang menariknya akan bergabung dengan baris berikutnya.sumber
Saya menggunakan c-free IDE versi 5.0, dalam program saya baik bahasa 'c ++' atau 'c' saya mendapatkan masalah yang sama. Tepat di akhir program, yaitu baris terakhir dari program (setelah penyangga fungsi, mungkin utama atau fungsi apa saja), tekan enter- line no. akan bertambah 1. kemudian jalankan program yang sama, itu akan berjalan tanpa kesalahan.
sumber
bukan C / C ++ spesifik tetapi dialek C: saat menggunakan
GL_ARB_shading_language_include
ekstensi, kompiler glsl di OS X memperingatkan Anda BUKAN tentang baris baru yang hilang. Jadi Anda dapat menulisMyHeader.h
file dengan pelindung kepala yang berakhir dengan#endif // __MY_HEADER_H__
dan Anda akan kehilangan garis setelah#include "MyHeader.h"
yakin.sumber
Karena perilaku berbeda antara versi C / C ++ jika file tidak berakhir dengan baris baru. Terutama jahat adalah versi C ++ - yang lebih lama, fx dalam C ++ 03 kata standar (fase terjemahan):
Perilaku tidak terdefinisi buruk: kompiler penyesuai standar dapat melakukan lebih atau kurang apa yang diinginkannya di sini (masukkan kode jahat atau apa pun) - jelas alasan peringatan.
Meskipun situasinya lebih baik di C ++ 11, adalah ide yang baik untuk menghindari situasi di mana perilaku tidak terdefinisi dalam versi sebelumnya. Spesifikasi C ++ 03 lebih buruk daripada C99 yang langsung melarang file tersebut (perilaku kemudian didefinisikan).
sumber
#include
arahan , dan beberapa programmer yang menargetkan kompiler semacam itu mungkin telah mengeksploitasi perilaku tersebut. Memiliki Standar meninggalkan hal-hal seperti itu Undefined akan memungkinkan program mengeksploitasi keanehan seperti itu didefinisikan dengan baik pada platform yang menentukan perilaku tersebut. Memiliki Standar mandat perilaku akan merusak program tersebut.Peringatan ini mungkin juga membantu untuk menunjukkan bahwa suatu file bisa saja terpotong. Memang benar bahwa kompiler mungkin akan melemparkan kesalahan kompiler - terutama jika itu di tengah fungsi - atau mungkin kesalahan linker, tetapi ini bisa lebih samar, dan tidak dijamin akan terjadi.
Tentu saja peringatan ini juga tidak dijamin jika file terpotong segera setelah baris baru, tetapi masih bisa menangkap beberapa kasus bahwa kesalahan lain mungkin terlewatkan, dan memberikan petunjuk yang lebih kuat untuk masalah ini.
sumber
Itu bukan kesalahan. Itu hanya peringatan.
Buka file dalam editor, pergi ke baris terakhir file, dan tekan enter untuk menambahkan baris kosong ke akhir file.
Padahal, selain itu, Anda harus menggunakan
#include <iostream>
bukan<iostream.h>
. Lalu masukkanusing std::cout;
setelah itu.sumber