2016-03-23 30 views
0

Linux'ta eğlenmek için bir SDL2 uygulaması geliştirdim, ancak Windows, Linux kullanıcısı olmayanları da test etmeden bile geliştiriyor (Windows'um yok, hiç sahip olmadım). Bunun için mingw kullanıyorum, çapraz derleme. Her şey güzel ama tek bir şey çalışıyor. Uygulama, C'deki basit printf() kullanarak bazı komut satırı anahtarlarını/mesajlarını/yardımlarını da içerir. Ancak, Windows'ta basit bir şekilde çalışmaz, kullanıcılara göre hiçbir çıktı gösterilmez. Bunu buldum: setvbuf (stdout, NULL, _IONBF, 0); ama yardımcı olmadı. Ayrıca, çeşitli belgeler ve -mconsole içinde mingw -mwindows geçişi buldum ama Windows iyi bilmiyorum beri, bu sisteme (Windows) bu garip işler nasıl çalışması gerektiğini hiçbir fikrim yok. Temel olarak, Linux'taki gibi benzer bir çözümü isterim: eğer bir terminal penceresinden başlıyorsanız, stdout'u görebilirsiniz, ancak eğer görünseler, hiç görülemezler, bu mesajlar için hiçbir pencere açık/gösterilmez.C printf() wining with win32

cevap

1

Linux programlarıyla aynı davranışta penceresiz bir alternatif biliyorum.

-mwindows olmadan (diğer pek çok şeyden başka), çıktınız stdout'a yönlendirilecek ve cmd cinsinden görüntülenecektir (ve diğer işlemler ile stdin borulara yönlendirilebilir), ancak eğer cmd olmadan çalıştıracaksanız çıktı için ekstra bir konsol penceresi açın.

-mwindows stdio artık konsolla bağlantılı değil. Çıktıyı yeniden yönlendirebilirsiniz, ancak görmüyorsunuz (ör. your_program.exe | cat çıkış gösterecektir, ancak standart pencerelerde cat yoktur). Bu mod, konsol penceresini otomatik olarak açmaz. Konsolu el ile oluşturabilir (veya ana işlem konsolunu devralabilir) ve stdout'u ona yönlendirebilirsiniz (freopen("CONOUT$", "w", stdout) ile), ancak bu 'gerçek' stdio olmaz ve diğer işlemlere (ki hala sizin için iyi olabilir.).

+0

Anlıyorum ve teşekkürler. -mwindows olmadan yeni konsol otomatik olarak veya sadece ilk çıkışta açılacak mı? Bir şekilde zaten bir konsol veya yeni bir _would_ açık olduğumu test edebilir miyim? Stdio arabelleğe alınmış mı? Sanırım printf() 'in ve sonra sadece freopen() hile yapsaydı, eski mesajlar kaybolur, sağa (-mwindows ile) demek? Genel olarak, yeni açılan cmd penceresinin (ve eğer varsa bir tane varsa) -mwindows olmadan kontrol edilmesi mümkündür. Yani, kapatıyorum ya da zaten sahip olduğumu test edin. Birçok olası başlangıç ​​soruları için özür dilerim. Teşekkürler! –

+0

Windows uzmanı değilim, ama çoğunuzun doğru olduğu anlaşılıyor. Sanırım karışıklıkların çoğu, pencereler konsol ve pencere uygulamalarını temelden ayırdığı için oluyor. Konsol uygulaması konsolu penceresi için 'ana 'öğenizden önce bile görünür ve programınız çıktığında otomatik olarak kapanır. Windows uygulaması için, ya ebeveynin işlem konsoluna eklemek için ya AllocConsole 'ya da 'AttachConsole (-1)' el ile manüel ya da isteğe bağlı olarak bir komut satırı geçişi yapın; Daha sonra stdin/stdout/stderr'yi yeniden bağlar ve gerekiyorsa arabelleklemeyi devre dışı bırakırsınız. – keltar

+0

Tekrar teşekkürler! Benim için özellikle kendiminkine göre bir pencere uzmanısınız :) Bu önerilen fonksiyonlara bakacağım. –