Apakah ada cara untuk gcc / g ++ untuk membuang definisi preprocessornya dari baris perintah? Aku hal-hal berarti seperti __GNUC__
, __STDC__
, dan sebagainya.
gcc
g++
c-preprocessor
Anycorn
sumber
sumber
echo | gcc -dM -E -
bekerja di windows juga.cpp -dM -E - < NUL
bisa digunakan.Saya biasanya melakukannya dengan cara ini:
Perhatikan bahwa beberapa definisi preprocessor bergantung pada opsi baris perintah - Anda dapat mengujinya dengan menambahkan opsi yang relevan ke baris perintah di atas. Misalnya, untuk melihat opsi SSE3 / SSE4 mana yang diaktifkan secara default:
dan kemudian membandingkan ini ketika
-msse4
ditentukan:Demikian pula Anda dapat melihat opsi mana yang berbeda antara dua set opsi baris perintah yang berbeda, misalnya membandingkan definisi preprosesor untuk tingkat optimisasi
-O0
(tidak ada) dan-O3
(penuh):sumber
Jawaban telat - Saya menemukan jawaban lain bermanfaat - dan ingin menambahkan sedikit ekstra.
Bagaimana cara membuang makro preprosesor yang berasal dari file header tertentu?
atau (terima kasih kepada @mymedia atas sarannya):
Secara khusus, saya ingin melihat apa yang SOMAXCONN didefinisikan pada sistem saya. Saya tahu saya bisa membuka file header standar, tetapi kadang-kadang saya harus mencari sedikit untuk menemukan lokasi file header. Alih-alih, saya hanya dapat menggunakan one-liner ini:
sumber
Pendekatan sederhana (
gcc -dM -E - < /dev/null
) berfungsi dengan baik untuk gcc tetapi gagal untuk g ++. Baru-baru ini saya membutuhkan tes untuk fitur C ++ 11 / C ++ 14. Rekomendasi untuk nama makro yang sesuai diterbitkan di https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recomendations . Tapi:selalu gagal, karena secara diam - diam memanggil driver-C (seolah-olah dipanggil oleh
gcc
). Anda dapat melihat ini dengan membandingkan outputnya dengan gcc atau dengan menambahkan g ++ - opsi baris perintah khusus seperti (-std = c ++ 11) yang memancarkan pesan kesalahancc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
.Karena (yang bukan C ++) gcc tidak akan pernah mendukung "Templates Alias" (lihat http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf ) Anda harus menambahkan
-x c++
opsi ke paksa pemanggilan kompiler C ++ (Kredit untuk menggunakan-x c++
opsi alih-alih file dummy kosong pergi ke yuyichao, lihat di bawah):Tidak akan ada output karena g ++ (revisi 4.9.1, default ke -std = gnu ++ 98) tidak mengaktifkan C ++ 11-fitur secara default. Untuk melakukannya, gunakan
yang akhirnya menghasilkan
mencatat bahwa g ++ 4.9.1 mendukung "Templates Alias" ketika dipanggil dengan
-std=c++11
.sumber
-x
argumen sehinggag++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cpp
seharusnya berfungsi.Pendekatan portabel yang bekerja dengan baik di Linux atau Windows (di mana tidak ada / dev / null):
Untuk c ++ Anda dapat menggunakan (ganti
c++11
dengan versi apa pun yang Anda gunakan):Ia bekerja dengan memberitahu gcc untuk preprocess stdin (yang diproduksi oleh echo) dan mencetak semua definisi preprocessor (mencari
-dletters
). Jika Anda ingin tahu definisi apa yang ditambahkan saat Anda memasukkan file header, Anda dapat menggunakan-dD
opsi yang mirip dengan -dM tetapi tidak menyertakan makro yang telah ditentukan:Perhatikan, bagaimanapun, bahwa input kosong masih menghasilkan banyak definisi dengan
-dD
opsi.sumber
NUL
, Anda kembali ke titik awal: itu tidak akan bekerja pada sistem yang tidak memilikinya.sort
berperilaku sedikit berbeda):echo | gcc -x c++ -std=c++17 -dM -E - | sort
Saat bekerja dalam proyek besar yang memiliki sistem build kompleks dan di mana sulit untuk mendapatkan (atau memodifikasi) perintah gcc / g ++ secara langsung, ada cara lain untuk melihat hasil ekspansi makro. Cukup mendefinisikan ulang makro, dan Anda akan mendapatkan hasil yang serupa dengan yang berikut:
sumber