“Dosya sonunda satırsonu yok” derleyici uyarısı


187

Bazı C ++ derleyicilerinde aşağıdaki uyarının nedeni nedir?

Dosyanın sonunda yeni satır yok

Bir kaynak / başlık dosyasının sonunda neden boş bir satır almalıyım?


17
Gerçekten nedeni değil, ancak catbir dosya varsa ve yeni kabuk istemi dosyanın son satırından sonra (yani 0 sütununda değil) görüneceğinden sondaki satırsonu yoksa çok sinir bozucu
21'de ThiefMaster

@ThiefMaster $ PS1'im bu nedenle yeni bir satırla başlıyor. (yine de çok satırlı bir bilgi istemi, bir satırda bir sürü yararlı bilgi ve daha sonra hiçbir şeyden başka bir bilgi istemi karakteri
içermiyor

7
Why should I have an empty line at the end of a source/header file- Bir metin dosyası içeriyorsa one\ntwo\nthree\n, hiçbiri boş olmayan üç satır içerir. Bir metin dosyası içeriyorsa, one\ntwo\nthreeo zaman bir metin dosyası değildir, aynı anlamda sonunda tam duraksız bir cümle bir cümle değildir.
Brandin

Yanıtlar:


217

Yeni satır yoksa oluşabilecek bazı sorunları düşünün. ANSI standardına göre, #includedosyanın başındaki dosya tam olarak dosyanın önündeki gibi eklenir ve dosyanın sonrasından sonra yeni satırı eklemez #include <foo.h>. Bu nedenle, ayrıştırıcının sonuna satırsonu içermeyen bir dosya eklerseniz, dosya son satırı foo.hilk satırıyla aynı satırdaymış gibi görünür foo.cpp. Ya foo.h dosyasının son satırı yeni bir satır olmadan bir yorum olsaydı? Şimdi ilk satırı foo.cppyorumlandı. Bunlar, sürünebilecek sorunların sadece birkaç örneğidir.


Sadece ilgilenen tarafları James'in cevabına yönlendirmek istedim. Yukarıdaki cevap C için hala doğru olsa da, yeni C ++ standardı (C ++ 11) değiştirilmiştir, böylece C ++ ve C ++ 11 ile uyumlu bir derleyici kullanılıyorsa bu uyarının artık verilmemesi gerekir.

James'in gönderisiyle C ++ 11 standardından:

Boş olmayan ve yeni satır karakteri ile bitmeyen ya da herhangi bir ekleme yapılmadan hemen önce ters eğik çizgi karakteri ile başlayan yeni satır karakteri ile biten bir kaynak dosyası, dosyaya satır karakteri eklendi (C ++ 11 §2.2 / 1).


28
Elbette pratikte her derleyici #include'dan sonra yeni bir satır ekliyor. Neyse.
mxcl

3
Microsoft Visual C ++ eski bir sürümü (2.x ya da bir şey gibi) tam olarak bu sorun olduğunu hatırlıyorum. IDE editörü bu tür eksik satırsonu davranışını teşvik ettiği için daha da kötüleşti.
Greg Hewgill

2
Derleyiciler şu anda şikayet etmeyebilir, ancak GitHub aslında.
Puyover

1
James'in "aşağıdaki" cevabını görebiliyorum ama: OrderBy'de "Yukarıdaki cevap" ne ?! Yukarıdaki soru, genellikle oyla sipariş ettiğim gibi. Yoksa kendi cevabını mı kastediyorsun?
mbx

@Thomas: Bu program, yeni satırla bitmediği için tanımlanmamış davranışları çağırıyor mu? Programa buradan bakın: ideone.com/jswwf9
Destructor

44

Her kaynak dosyasının kaçmamış bir yeni satırla bitmesi şartı C ++ 11'de kaldırıldı. Spesifikasyon şimdi şu şekildedir:

Boş olmayan ve yeni satır karakteri ile bitmeyen ya da herhangi bir ekleme yapılmadan hemen önce ters eğik çizgi karakteri ile başlayan yeni satır karakteri ile biten bir kaynak dosyası, dosyaya satır karakteri eklendi (C ++ 11 §2.2 / 1).

Uygun bir derleyici artık bu uyarıyı vermemelidir (en azından C ++ 11 modunda derlerken, derleyicinin dil belirtiminin farklı revizyonları için modları varsa).


4
C ++ için her şey yolunda ve iyi; maalesef C, önümüzdeki C1X standardının son taslağında bile UB olduğunu söylüyor.
Adam Rosenfield

11
Bu soru [c] değil, [c ++] olarak etiketlenmiştir.
James McNellis

3
Buna rağmen, muhtemelen gerektiğini burada kendi yolunu bulacaktır C bu uyarı ararken birçok kişi bu yana, [c] etiketlenecek.
Adam Rosenfield

1
Bu hala eklemek için iyi bir nokta. Bunu yukarı ekleyerek. Umursamıyorsun.
TJ Seabrooks

25

C ++ 03 Standardı [2.1.1.2] şunları beyan eder:

... Boş olmayan bir kaynak dosya yeni satır karakteri ile bitmezse veya bu tür bir ekleme işlemi gerçekleşmeden hemen önce ters eğik çizgi karakteri ile başlayan yeni satır karakteri ile biterse, davranış tanımsızdır.


16

"İtaatkâr" cevabı "C ++ 03 Standardı, yeni satırda bitmeyen bir programın davranışının tanımsız olduğunu söylüyor" (başka bir deyişle).

Meraklı için cevap burada: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html .


4
Ahh, sevgili "tanımsız davranış". Diğer diller başarısız olduğunda, c / c ++ "tanımsız" şekillerde davranır :) Bu kesinlikle çekiciliğinin büyük bir parçasıdır. Ve şaka yapmıyorum.
parlak

6

Boş bir satıra atıfta bulunmaz, son satırın (içinde içeriğe sahip olabilen) yeni satırla sonlandırılıp sonlandırılmayacağıdır.

Çoğu metin düzenleyicisi dosyanın son satırının sonuna yeni satır koyar, bu nedenle son satırda bir satır yoksa, dosyanın kısaltılması riski vardır. Ancak, yeni satırı istememenizin geçerli nedenleri olabilir, bu yüzden bir hata değil, yalnızca bir uyarıdır.


5

#includesatırını dosyanın gerçek içeriği ile değiştirir. Dosya yeni satırla bitmezse, dosyayı #includeçeken satırı içeren satır sonraki satırla birleştirilir.


2

Ben c-ücretsiz IDE sürüm 5.0 kullanıyorum, benim progrm ya 'c ++' ya da 'c' dil i aynı sorunu alıyordu . Programın sonunda yani programın son satırında ana veya herhangi bir işlev), enter -line no. 1. daha sonra aynı programı yürütecek, hatasız çalışacaktır.


2

Elbette pratikte her derleyici #include'dan sonra yeni bir satır ekliyor. Neyse. - @mxcl

belirli bir C / C ++ değil, bir C lehçesi: GL_ARB_shading_language_includeuzantıyı kullanırken OS X'deki glsl derleyicisi eksik bir satırsonu hakkında DEĞİL uyarır . Bir yazabilirsiniz Yani MyHeader.hbiten bir başlık görevlisi ile dosya #endif // __MY_HEADER_H__ve olacak sonra duruşu kaybeder #include "MyHeader.h"kesin.


2

Çünkü dosya yeni satırla bitmezse, davranış C / C ++ sürümleri arasında farklılık gösterir. Özellikle kötü eski C ++ - sürümleri, standart C ++ 03 fx diyor (çeviri aşamaları):

Boş olmayan bir kaynak dosya yeni satır karakteri ile bitmezse veya hemen ters eğik çizgi karakteri ile başlayan yeni satır karakteri ile biterse, davranış tanımsız olur.

Tanımsız davranış kötüdür: standart uyumlu bir derleyici burada istediklerini az çok yapabilir (kötü amaçlı kod veya her neyse) - açıkça bir uyarı nedeni.

C ++ 11'de durum daha iyi olsa da, davranışın önceki sürümlerde tanımlanmadığı durumlardan kaçınmak iyi bir fikirdir. C ++ 03 belirtimi, bu tür dosyaları açıkça yasaklayan C99'dan daha kötüdür (davranış daha sonra tanımlanır).


Standardın sondaki yeni satırı olmayan programların kötü biçimlendirildiklerini belirtmek yerine Tanımlanmamış Davranışa sahip olduklarından şüpheleniyorum, çünkü bazı derleyiciler, #includeyönergeyi izleyen kaynak kod metniyle birlikte verilen bir dosyanın sonlandırılmamış bir son satırını birleştirir ve bu tür derleyicileri hedefleyen bazı programcılar bu tür davranışlardan faydalanmış olabilir. Standardın bu tür şeyleri Tanımlamaması, bu tür tuhaflıkları kullanan programların, bu tür davranışları belirleyen platformlarda iyi tanımlanmasına izin verecektir. Standardın bir davranışa sahip olması bu tür programları bozar.
supercat

0

Bu uyarı, bir dosyanın bir şekilde kısaltılabileceğini belirtmeye de yardımcı olabilir. Derleyicinin muhtemelen bir derleyici hatası atayacağı doğrudur - özellikle bir işlevin ortasındaysa - veya belki bir bağlayıcı hatasıdır, ancak bunlar daha şifreli olabilir ve gerçekleşmesi garanti edilmez.

Tabii ki bu uyarı, dosya yeni satırdan hemen sonra kesilirse de garanti edilmez, ancak yine de diğer hataların kaçırabileceği bazı durumlar yakalanabilir ve soruna daha güçlü bir ipucu verebilir.


-2

Bu bir hata değil. Bu sadece bir uyarı.

Dosyayı bir düzenleyicide açın, dosyanın son satırına gidin ve dosyanın sonuna boş bir satır eklemek için enter tuşuna basın.

Bununla birlikte, bunun #include <iostream>yerine, kullanmalısınız <iostream.h>. Sonra bir tane koyun using std::cout;.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.