C ön işlemcisinden mesaj yazdırmanın taşınabilir bir yolu var mı?


101

Gibi bir şey yapabilmek isterdim

#print "C Preprocessor got here!"

hata ayıklama amacıyla. Bunu yapmanın en iyi / en taşınabilir yolu nedir?

Yanıtlar:


120

warningYönerge muhtemelen size en yakın seçenek, ama tamamen platformdan bağımsız değil:

#warning "C Preprocessor got here!"

AFAIK bu, üzerinde bir pragmayönerge kullanmanız gereken MSVC dışındaki çoğu derleyicide çalışır :

#pragma message ( "C Preprocessor got here!" )

5
Bu soruyu akla getiren, "pragma mesajı" ile "uyarıyı" bir şekilde değiştirmek için derleme bayrağına dayalı bir yönerge koyabilir misiniz? Örneğin, şöyle bir şey: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... Bunu denemem gerek ama içgüdü bana cevabın hayır olduğunu söylüyor.
Bryan

11
@Bryan: Evet. #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner

1
#pragma message (), gcc'nin eski sürümleri tarafından desteklenmez (örneğin, gcc 4.1.2, RHEL5'teki varsayılan sürüm). Henüz bu eski sürümler için uygun bir eşdeğer bulamadım - #warning harika olmayacak, çünkü uyarılar genel olarak bizim için hata olarak değerlendiriliyor ve derlemeyi durdurmak yerine mesajın bilgilendirici olmasını gerçekten istiyoruz.
Danny S.

6
Projeniz varsayılan olarak -Wall ile derlendiğinde bir uyarı vermek çok sakıncalıdır. #pragma mesajında ​​bu sorun yok.
Renan Gemignani

56

Aşağıdakiler MSVC ve GCC tarafından desteklenmektedir .

#pragma message("stuff")
#pragma message "stuff"

Clang son zamanlarda destek eklemeye başladı, daha fazlası için buraya bakın .


3
Sadece kayıt için, Solaris Studio 12.3 (Sun C 5.12) bu pragmayı desteklemiyor.
maxschlepzig

Visual Studio vMicro kullanarak Arduino 1.8 ile çalışır. Teşekkürler!
save_jeff

12

Denemek isteyebilirsin: #pragma message("Hello World!")


9

Çoğu C derleyicisi bir #warningyönergeyi tanıyacaktır , bu nedenle

 #warning "Got here"

Ayrıca standart '#error' yönergesi de var,

 #error "Got here"

Tüm derleyiciler bunu desteklerken, derlemeyi / ön işlemeyi de durduracaktır.


6
#pragma message("foo")

harika çalışıyor. Ayrıca -Werror kullansanız bile derlemeyi durdurmaz


0

Başka bir çözüm de yorumları ve bunları işlemek için bir kabuk komut dosyası kullanmaktır. Bu biraz disiplin (veya yazım hatalarını yakalayan bir kabuk betiği) gerektirir.

Örneğin, biçimlendirilmiş yorumları //TODOve ardından hepsini bir raporda toplayan bir kabuk betiği ekliyorum .

Daha karmaşık kullanım durumları için kendi basit ön işlemcinizi yazmayı deneyebilirsiniz. Örneğin, kaynaklarınızı *.c2dosyalar olarak düzenleyebilirsiniz . Basit ön işlemci kaynağı okur, arar //TODOve printf("TODO ...")çıktı *.cdosyasına yazar.


-17

Yapamazsın. Önişlemciler C kodundan önce işlenir. Ekrana yazdırılacak önişlemci yönergeleri yoktur, çünkü önişlemci kodu çalıştırılmadığından, çalıştırılabilir koda derlenecek C kodunu oluşturmak için kullanılır.

Yanlış olan herhangi bir şey:

#ifdef ...
printf("Hello");
#endif

Çünkü önişlemciler söz konusu olduğunda yapabileceğiniz tek şey bu.


5
Bu, derleme zamanında yazdırılmayacak, bence OP'nin aradığı şey bu.
Bob Kaufman

Çalışma zamanında basmayı kastettiğini varsaydım.
Alexander Rafferty

1
Derleme zamanını soruyordum. Teşekkürler!
Andrew Wagner
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.