Apakah ada cara portabel untuk mencetak pesan dari C preprocessor?

99

Saya ingin bisa melakukan sesuatu seperti

#print "C Preprocessor got here!"

untuk tujuan debugging. Apa cara terbaik / paling portabel untuk melakukan ini?

Andrew Wagner
sumber

Jawaban:

114

The warningdirektif mungkin yang paling dekat Anda akan mendapatkan, tapi itu tidak sepenuhnya platform-independen:

#warning "C Preprocessor got here!"

AFAIK ini berfungsi pada sebagian besar kompiler kecuali MSVC, di mana Anda harus menggunakan pragmaarahan:

#pragma message ( "C Preprocessor got here!" )
Kamu
sumber
5
Yang menimbulkan pertanyaan, dapatkah Anda menempatkan arahan berdasarkan bendera kompilasi untuk menukar "pesan pragma" dan "peringatan" entah bagaimana? Misalnya, sesuatu seperti: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... Saya harus mencobanya tetapi naluri memberi tahu saya jawabannya tidak.
Bryan
11
@ Bryan: Ya. #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner
1
#pragma message () tidak didukung oleh versi gcc yang lebih lama (seperti gcc 4.1.2, versi default di RHEL5). Saya belum menemukan padanan yang sesuai untuk versi yang lebih lama ini - #warning tidak akan bagus, karena peringatan diperlakukan sebagai kesalahan bagi kami secara umum, dan kami sangat ingin pesan tersebut menjadi informasional, daripada menghentikan kompilasi.
Danny S
6
Mengeluarkan peringatan sangat merepotkan saat project Anda dikompilasi dengan -Wall secara default. #pragma message tidak memiliki masalah itu.
Renan Gemignani
56

Berikut ini didukung oleh MSVC , dan GCC .

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

Clang baru-baru ini mulai menambahkan dukungan, lihat di sini untuk selengkapnya.

Matt Joiner
sumber
3
Sekadar catatan, Solaris Studio 12.3 (Sun C 5.12) tidak mendukung pragma ini.
maxschlepzig
Bekerja dengan Arduino 1.8 menggunakan Visual Studio vMicro. Terima kasih!
save_jeff
12

Anda mungkin ingin mencoba: #pragma message("Hello World!")

Ruel
sumber
9

Kebanyakan kompiler C akan mengenali sebuah #warningdirektif, jadi

 #warning "Got here"

Ada juga petunjuk standar '#error',

 #error "Got here"

Sementara semua kompiler mendukungnya, itu juga akan menghentikan kompilasi / preprocessing.

no
sumber
6
#pragma message("foo")

bekerja dengan baik. Juga tidak akan menghentikan kompilasi bahkan jika Anda menggunakan -Werror

Martin
sumber
0

Solusi lain adalah menggunakan komentar ditambah skrip shell untuk memprosesnya. Ini membutuhkan beberapa disiplin (atau skrip shell yang menangkap kesalahan ketik).

Misalnya, saya menambahkan komentar yang diformat //TODOdan kemudian skrip shell yang mengumpulkan semuanya menjadi laporan.

Untuk kasus penggunaan yang lebih kompleks, Anda dapat mencoba menulis preprocessor sederhana Anda sendiri. Misalnya, Anda dapat mengedit sumber Anda sebagai *.c2file. Praprosesor sederhana akan membaca sumber, mencari //TODO, dan menulis printf("TODO ...")ke dalam *.cfile keluaran .

Aaron Digulla
sumber
-17

Tidak boleh. Praprosesor diproses sebelum kode C. Tidak ada arahan preprocessor untuk dicetak ke layar, karena kode preprocessor tidak dijalankan, itu digunakan untuk menghasilkan kode C yang akan dikompilasi menjadi kode yang dapat dieksekusi.

Ada yang salah dengan:

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

Karena hanya ini yang dapat Anda lakukan sejauh preprosesor bekerja.

Alexander Rafferty
sumber
5
Ini tidak akan dicetak pada waktu kompilasi, yang menurut saya OP sedang mencari.
Bob Kaufman
Saya berasumsi yang dia maksud adalah mencetak pada saat run-time.
Alexander Rafferty
1
Saya bertanya tentang waktu kompilasi. Terima kasih!
Andrew Wagner