C ++ 20, dosyalarda saklanan kaynak kodunu zorunlu kılıyor mu?


106

Biraz garip bir soru, ancak doğru hatırlıyorsam, C ++ kaynak kodu, dosyalarını depolamak için bir dosya sistemi gerektirmez.

El yazısı kağıtları bir kamera aracılığıyla tarayan bir derleyiciye sahip olmak uygun bir uygulama olacaktır. Pratik olarak bu kadar mantıklı olmasa da.

Ancak C ++ 20 artık file_name. Şimdi bu, kaynak kodun her zaman bir dosyada saklanması gerektiği anlamına mı geliyor?


13
Bu sonsuza dek C oldu - __FILE__. Sınıf source_location, onu işlev çağrı sitesinde almanıza izin verir.
StaceyGirl

28
El yazısı kağıtlarınıza dosya adı veremez misiniz?
Jarod42

8
Bence kaynak kodun dosyalarda mı yoksa başka bir şeyde mi olduğu bir uygulama ayrıntısı. Derleyici kaynak kodu stdin aracılığıyla beslenebiliyorsa, kaynak bir veritabanında olabilir.
Eljay

8
Örneğim biraz eksik olabilir, ancak TCC gibi bazı anında derleyici kullanırsanız, doğrudan bellekten derlemenize rağmen hata bildirimi uğruna her zaman insan tarafından okunabilir bir kaynak adı sağlayabilirsiniz. Bu, bir "dosya adına" sahip olmak, bir dosya olarak saklandığı anlamına gelmez.
user7860670

2
Şüphesiz bu <iostream> , geliştiriciler tarafından yazılan dosyalar değil, dosyalar gibi uygulama dosyalarıdır (ne demek istediğimi anlıyorsanız)?

Yanıtlar:


110

Hayır, kaynak kodun bir dosyadan gelmesi (veya bir dosyaya gitmesi) gerekmez.

Derleyicinizi ortaya koyarak C ++ 'yı tamamen bir boru içinde derleyebilir (ve bağlayabilirsiniz), örn.

generate_source | g++ -o- -xc++ - | do_something_with_the_binary

ve onlarca yıldır böyleydi. Ayrıca bakınız:

std::source_locationC ++ 20'nin tanıtımı bu durumu değiştirmez. Sadece bazı kodların iyi tanımlanmış bir kaynak konumu olmayacaktır (veya iyi tanımlanmış olabilir, ancak çok anlamlı olmayabilir). Aslında, std::source_locationdosyaları kullanarak tanımlama konusundaki ısrarın biraz miyop olduğunu söyleyebilirim ... ancak adalet içinde, bu sadece makro içermeyen bir eşdeğerdir __FILE__ve __LINE__C ++ (ve C) 'de zaten mevcuttur.

@ HBv6 __FILE__, standart giriş akışından GCC kullanarak derleme yaparken değerini yazdırırsanız :

echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++  -

ortaya çıkan yürütülebilir baskıların çalıştırılması <stdin>.

Kaynak kodu internetten bile gelebilir.

@Morwenn bu kodu not eder:

#include <https://raw.githubusercontent.com/Morwenn/poplar-heap/master/poplar.h>

// Type your code here, or load an example.
void poplar_sort(int* data, size_t size) {
    poplar::make_heap(data, data + size);
    poplar::sort_heap(data, data + size);
}

GodBolt üzerinde çalışır (ancak makinenizde çalışmaz - hiçbir popüler derleyici bunu desteklemez.)

Dil avukatı mısınız? Tamam, hadi standarda bakalım ..

C ++ program kaynaklarının dosyalardan gelmesi gerekip gerekmediği sorusu dil standardında net bir şekilde yanıtlanmamıştır. C ++ 17 standardının (n4713) taslağına bakıldığında, bölüm 5.1 [lex.separate] şunu okur:

  1. Programın metni, bu belgede kaynak dosyalar olarak adlandırılan birimler halinde tutulur. Ön işleme yönergesi #include aracılığıyla tüm üstbilgiler (20.5.1.2) ve dahil edilen kaynak dosyalar (19.2) ile birlikte bir kaynak dosyaya, koşullu dahil etme (19.1) ön işleme yönergelerinden herhangi biri tarafından atlanan kaynak satırları hariç, çeviri birimi denir.

Bu nedenle, kaynak kodu mutlaka bir dosyada değil, "kaynak dosyası adı verilen bir birimde" tutulur. Ama o zaman, içerikler nereden geliyor? Dosya sistemindeki adlandırılmış dosyalardan geldikleri varsayılır ... ama bu da zorunlu değildir.

Her halükarda, std::source_locationbu ifadeyi C ++ 20'de değiştirmiyor veya yorumunu (AFAICT) etkiliyor gibi görünmüyor.


9
Bu boru, standardın amaçları doğrultusunda bir "kaynak dosya" dır.
melpomene

5
Şu tanımları yapan C standardına bakıyorum: "Programın metni, bu Uluslararası Standartta kaynak dosyalar (veya önişleme dosyaları ) adı verilen birimlerde tutulur ." Yani kod nerede saklanırsa saklansın, bu Standardese'de bir "kaynak dosya" dır. (Ek: Benzer dil C ++ standardında [lex] altında bulunur.)
melpomene

8
@melpomene: Birimlere sadece kaynak dosyalar denir , aslında kaynak dosyalar olmaları gerektiğini söylemez. Ancak yanıtı bunu içerecek şekilde düzenleyeceğim.
einpoklum

13
Bunu GCC ile denedim: "echo '#include <stdio.h> \ nint main () {printf ("% s \\ n ", __FILE__); return 1;}' | gcc -o test -xc -" ( tırnak işareti olmadan). Yürütüldüğünde, <stdin> yazdırır.
HBv6

11
Standartlarda (ve bilimlerde) terimler, isimler ve kavramlar hakkında komik bir şey var: bunlar genellikle atomiktir. Yani, "kaynak dosya" mutlaka "kaynak" olan bir "dosya" değildir, aslında "dosya" terimi basitçe tanımlanmayabilir - matematikteki sayılarla karşılaştırın: "sadece" diye bir şey yoktur. sayı ", yalnızca" doğal sayı "," rasyonel sayı "," gerçek sayı "vb.
Joker_vD

53

C ++ 20'den önce bile standart şunlara sahipti:

__FILE__

Geçerli kaynak dosyanın varsayılan adı (bir karakter dizesi değişmezi).

Tanım için aynıdır source_location::file_name.

Bu nedenle, C ++ 20'de dosya sistemi içermeyen uygulamaları desteklemede bir değişiklik olmamıştır.

Standart, "kaynak dosyanın" ne anlama geldiğini tam olarak tanımlamaz, bu nedenle bir dosya sistemine atıfta bulunup bulunmaması yorumlamaya bağlı olabilir. Muhtemelen, bir uygulamanın "tam o sırada bana verdiğin el yazısıyla yazılmış notu" üretmesi, eğer bu gerçekten de dilin o uygulamasındaki "kaynak dosya" yı tanımlıyorsa uygun olabilir.


Sonuç olarak: Evet, kaynaklar standart olarak "dosyalar" olarak adlandırılır, ancak "dosyanın" ne olduğu ve bir dosya sisteminin dahil olup olmadığı belirtilmemiştir.


2
@Yksisarvinen Ben kuralın "karine" yeterliliğin tam niyetini bilmiyoruz ama tahmin o ihtiyacı Doest dosya adı mutlak veya kanonik ziyade açısından göreceli bir isim olabilir dair bir açıklama olduğunu :) derleyici yeterlidir. Yanlış olabilirim.
eerorika

4
Sadece görebilirsiniz scanner-c++dönen "Sol-kabine, üçüncü çekmece, dördüncü kırmızı-sekmeli klasör, sayfa 17" .
dmckee --- ex-modererator kitten

2
FWIW, POSIX anlamında, bir boru (veya başka bir dosya benzeri şey) bir "dosya" dır - bu nedenle, stdin / stdout "dosyalardır", bu anlamda disk dosyaları vb. Değil.

3
@Yksisarvinen: Komite, anlaşılması güç uygulamaların sıradan davranışa aykırı bir şey yapmak için iyi nedenlere sahip olabileceği durumları genellikle hesaba katar. Bunu yaparken, müşterilerinin sıradan davranışı bazı alternatiflerden daha fazla veya daha az yararlı bulup bulmayacağına karar vermek için derleyici yazarlarına güvenir. Bu tür şeylerin uygulayıcıların yargısına bırakılması bir "belirsizlik" olarak görülebilir, ancak kasıtlı bir durumdur, çünkü iyi derleyici yazarlar müşterilerinin ihtiyaçları hakkında Komitenin yapabileceğinden çok daha fazlasını bileceklerdir.
supercat

1
@dmckee ... kullanılmayan bir tuvalette, kapısında "
Andrew Henle
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.