Önce Derle, Sonra Çalıştır
Artık kurulu bir derleyiciniz olduğuna göre, bir C++ programını çalıştırmak iki adımlı bir döngüdür. Bir yorumlayıcının dosyanızı satır satır okuduğu betik dillerinin aksine, C++ önce kaynak kodunuzu yerel bir çalıştırılabilir dosyaya - makine kodundan oluşan bağımsız bir ikiliye - derler, ardından siz o ikiliyi doğrudan çalıştırırsınız. Çalışma zamanında programınız ile CPU arasında oturan bir yorumlayıcı yoktur.
İşte C++'ın hızlı olmasının ve bir söz dizimi hatasının sizi çalışmanın ortasında değil de derleme zamanında durdurmasının nedeni bu ayrımdır. Derleyici, herhangi bir şey üretmeden önce dosyanın tamamını denetler.
Bağımsız herhangi bir örneği tam burada, sayfada çalıştırabilirsiniz - aşağıdaki editör onu sizin için derleyip çalıştırır. Ama kendi makinenizde ne olduğunu bilmekte fayda var, çünkü gerçek projeler orada yaşar.
Kendi Makinenizde Derle-ve-Çalıştır Döngüsü
Diyelim ki bunu main.cpp olarak kaydettiniz:
#include <iostream>
using namespace std;
int main() {
cout << "Hello from the terminal" << endl;
return 0;
}
Dosyayı içeren klasörde bir terminal açın ve derleyiciyi çağırın. En yaygın derleyici g++'tır (GCC'nin bir parçası); buradaki her şey için clang++ de birebir aynı şekilde çalışır:
g++ main.cpp -o main
Kod temiz şekilde derlenirse g++ hiçbir şey yazdırmaz ve kaynağınızın yanında yeni bir dosya oluşturur: main adında bir çalıştırılabilir dosya (Windows'ta main.exe). O ikili makine kodudur - okunabilir metin değildir ve işletim sisteminize ve CPU'nuza bağlıdır. Şimdi çalıştırın:
./main
Hello from the terminal
Windows'ta aynı terminalden main.exe (ya da sadece main) olarak çalıştırırdınız. macOS ve Linux'taki ./, kabuğa "program tam burada, bu klasörde; PATH'te bir yerde değil" der - yeni başlayanların unuttuğu, sonra da main'in neden command not found dediğini merak ettikleri bir adım.
-o Ne Yapar (ve a.out)
-o bayrağı çıktıya ad verir. Onu atarsanız g++ yine derler, ama çalıştırılabilir dosyayı varsayılan bir adla yazar: macOS/Linux'ta a.out, Windows'ta a.exe.
g++ main.cpp # produces a.out, not main
./a.out
Bu insanların sürekli ayağına dolanır: derlerler, hata görmezler, ./main çalıştırırlar ve No such file or directory alırlar - çünkü ikilinin asıl adı a.out'tur. Tam olarak neyi çalıştırdığınızı bilmek için her zaman -o verin.
Kaynaktaki her değişiklik için bir kez derlersiniz. Bundan sonra çalıştırılabilir dosya bağımsızdır - yeniden derlemeden ./main'i yüz kez çalıştırabilirsiniz. g++'ı yalnızca .cpp dosyasını düzenledikten sonra tekrar çalıştırırsınız.
Bir C++ Standardı Seçmek
C++'ın sürümleri vardır - C++11, C++14, C++17, C++20, C++23 - her biri dile özellikler ekler. İşin püf noktası: derleyiciniz, beklediğinizden daha eski olabilen bir varsayılan standart seçer; bu yüzden modern kod görünürde bir sebep olmadan derlenmeyebilir. Standardı -std ile açıkça ayarlayın:
g++ -std=c++17 main.cpp -o main
g++ -std=c++20 main.cpp -o main
İşte bir C++17 özelliği (structured bindings) kullanan bir kod. Editörde sorunsuz derlenir, ama kendi makinenizde -std=c++17 ya da daha yenisine ihtiyaç duyar:
Eğer 'structured bindings' only available with '-std=c++17' gibi bir hata görürseniz, çözüm kodunuzda değil - doğru -std bayrağını eklemekte. Bu kurs boyunca C++17 ya da daha yenisini varsayın.
Uyarıları Açın
Bir C++ programı temiz şekilde derlenip yine de yanlış olabilir. Derleyici, isterseniz, kod çalışma zamanında sizi ısırmadan önce şüpheli kodu işaret eder. -Wall -Wextra ekleyin:
g++ -std=c++17 -Wall -Wextra main.cpp -o main
Şu programı düşünün. -Wall olmadan derlenir, ama gerçek bir hatası var - hiç değer verilmemiş bir değişkeni okumak, ki bu tanımsız davranıştır:
#include <iostream>
using namespace std;
int main() {
int count; // never initialized
cout << count << endl; // reads garbage - undefined behavior
return 0;
}
Uyarılar açıkken derleyici bunu işaretler:
warning: 'count' is used uninitialized [-Wuninitialized]
İlk günden itibaren -Wall -Wextra ile derleme alışkanlığı edinin. Uyarılar, derleyicinin size ücretsiz kod incelemesi yapmasıdır; onları görmezden gelmek, ince hataların hayatta kalma yoludur. Buradaki çözüm basitçe int count = 0;.
Derleyici Hatalarını Okumak
g++ kodunuzu reddettiğinde dosyayı, satırı ve neyin yanlış gittiğini söyler. Bu mesajları okumayı öğrenmek, tıkanıklıktan kurtulmanın yarısıdır. İşte klasik olan - eksik bir noktalı virgül:
#include <iostream>
using namespace std;
int main() {
cout << "Oops" // no semicolon
return 0;
}
main.cpp:5:5: error: expected ';' before 'return'
5 | return 0;
| ^~~~~~
Dikkat edilecek birkaç şey. Hata 5. satırı bildiriyor, ama yanlışlık 4. satırda - derleyici noktalı virgülün eksik olduğunu ancak bir sonraki belirtece (token) ulaştığında fark eder. Yani bir hata sorunsuz görünen bir satırı gösterdiğinde, bir önceki satıra bakın. main.cpp:5:5 dosya, satır ve sonra sütundur. Yalnızca adını verdiği tek şeyi düzeltin ve yeniden derleyin - tahmin etmekten kaçının.
Derleyici hataları, henüz hiçbir şeyin çalışmadığı anlamına gelir. Bunlar, programınızın başlayıp sonra çöktüğü çalışma zamanı hatalarından farklıdır. Hataları, program hiç çalışmadan önce, derleme zamanında yakalamak C++'ın en büyük güçlerinden biridir.
Bir Sağlama Programı
Bunu editörde çalıştırın ya da main.cpp olarak kaydedip kendi makinenizde g++ -std=c++17 -Wall main.cpp -o main ardından ./main yapın. Üç satır da görünürse araç zinciriniz baştan sona çalışıyor demektir:
Burada birazdan düzgünce tanışacağınız üç şey karşınıza çıkıyor: bir int değişkeni, bir vector (C++'ın yeniden boyutlandırılabilir dizisi) ve çıktı için cout. Şimdilik programın derlenmesi ve üç satırı sırayla yazdırması yeterli.
Sonraki: C++ Söz Dizimi
Birkaç program derleyip çalıştırdınız, ama noktalama işaretlerine değinmeden geçtik - #include satırları, süslü parantezler, noktalı virgüller, int main() ve her satırın neden böyle göründüğü. Sonraki sayfa C++ söz dizimini parça parça inceler; böylece yapı, bir kalıp gibi hissettirmeyi bırakıp anlam kazanmaya başlar.
Sıkça Sorulan Sorular
Bir C++ programını nasıl derleyip çalıştırırım?
Kodunuzu main.cpp olarak kaydedin, o klasörde bir terminal açın ve çalıştırılabilir bir dosya üretmek için g++ main.cpp -o main komutunu çalıştırın. Ardından macOS/Linux'ta ./main, Windows'ta main.exe ile çalıştırın. Bir kez derlersiniz; ortaya çıkan ikiliyi istediğiniz kadar çalıştırabilirsiniz.
g++ içinde -o bayrağı ne işe yarar?
-o çıktı dosyasına ad verir. g++ main.cpp -o hello, hello adında bir çalıştırılabilir dosya oluşturur. -o bırakırsanız g++ varsayılan olarak a.out (Windows'ta a.exe) adını kullanır - yeni başlayanların çoğu zaman oluşturduklarının farkında olmadıkları bir dosyayı çalıştırmasının nedeni de budur.
C++17 veya C++20 gibi belirli bir standartla C++ nasıl derlenir?
-std bayrağını verin: g++ -std=c++17 main.cpp -o main ya da -std=c++20. Bayrak olmadan derleyici beklediğinizden daha eski olabilecek kendi varsayılanını kullanır; bu yüzden structured bindings veya <ranges> gibi yeni özellikler, standardı açıkça belirleyene kadar derlenmeyebilir.