दिलचस्प पोस्ट
एक ListView पर लौटने जब बनाए रखें / सहेजें / स्क्रॉल स्थिति को पुनर्स्थापित करें मैनपेज में यूनिक्स कमांड नामों के बाद दिखाए गए कोष्ठकों में संख्या क्या है? codeigniter वेबसाइट बहु भाषा बनाने का सबसे अच्छा तरीका लैंग एरेज़ से फोन करना लैंग सत्र पर निर्भर करता है? Java.exe और javaw.exe के बीच अंतर सी ++ में ऑब्जेक्ट का डायनामिक आरम्भिकरण क्या है? किसी अन्य वेबपेज पर कैसे पुनर्निर्देशित किया जा सकता है? जेएस के अंदर गतिशील रूप से लोड करें एचटीएमएल क्षेत्र टैग पर होवरिंग कैसे करें? एक MSI लॉग फ़ाइल बनाएँ MySQL के साथ यादृच्छिक पंक्तियों का चयन करना सी # के साथ GPU का उपयोग UITableView अनंत स्क्रॉलिंग मैं Android में सीमाओं के साथ एक टेबल कैसे बना सकता हूं? विभिन्न नियंत्रक क्रिया विधियों के बीच डेटा पास करना एंड्रॉइड गतिविधि क्लास नॉटफॉइड अपवाद – सब कुछ का प्रयास किया

जीसीसी डंप प्रीप्रोसेसर परिभाषित करता है

क्या जीसीसी / जी ++ के लिए इसका प्रीप्रोसेसर डंप करने का एक तरीका है जो कमांड लाइन से परिभाषित करता है? मेरा मतलब है __GNUC__ , __STDC__ और इतने पर।

वेब के समाधान से एकत्रित समाधान "जीसीसी डंप प्रीप्रोसेसर परिभाषित करता है"

हां, -सी के बजाय -E -dM विकल्प का उपयोग करें उदाहरण (उन्हें स्टडआउट में आउटपुट करता है):

  gcc -dM -E - < /dev/null 

जीसीसी पुस्तिका से :

सामान्य उत्पादन के बजाय, पूर्वनिर्धारित मैक्रोज़ सहित, पूर्वप्रक्रमक के निष्पादन के दौरान परिभाषित सभी मैक्रोज़ के लिए `# परिभाषित 'निर्देशों की एक सूची तैयार करें। यह आपको पूर्वप्रक्रमक के आपके संस्करण में पूर्वनिर्धारित किया गया है, यह जानने का एक तरीका देता है मान लें कि आपके पास कोई फ़ाइल नहीं है foo.h, कमांड

 touch foo.h; cpp -dM foo.h 

सभी पूर्वनिर्धारित मैक्रोज़ दिखाएंगे I

यदि आप -ई विकल्प बिना -ई विकल्प का उपयोग करते हैं, तो -dm को -fdump-rtl-mach के पर्याय के रूप में व्याख्या की जाती है।

मैं आमतौर पर यह इस तरह करते हैं:

 $ gcc -dM -E - < /dev/null 

ध्यान दें कि कुछ प्रीप्रोसेसर परिभाषित करता है कि कमांड लाइन विकल्पों पर निर्भर है – आप उपरोक्त कमांड लाइन के लिए प्रासंगिक विकल्प जोड़कर इनका परीक्षण कर सकते हैं। उदाहरण के लिए, यह देखने के लिए कि डिफ़ॉल्ट रूप से कौन से SSE3 / SSE4 विकल्प सक्षम हैं:

 $ gcc -dM -E - < /dev/null | grep SSE[34] #define __SSE3__ 1 #define __SSSE3__ 1 

और उसके बाद तुलना करें जब -msse4 निर्दिष्ट किया जाता है:

 $ gcc -dM -E -msse4 - < /dev/null | grep SSE[34] #define __SSE3__ 1 #define __SSE4_1__ 1 #define __SSE4_2__ 1 #define __SSSE3__ 1 

इसी प्रकार आप देख सकते हैं कि कमांड लाइन विकल्पों के दो अलग-अलग सेटों के बीच कौन से विकल्प अलग-अलग होते हैं, उदा। पूर्वप्रक्रमक की तुलना ऑप्टिमाइज़ेशन स्तर- -O0 (कोई नहीं) और -O0 (पूर्ण) के लिए परिभाषित करता है:

 $ gcc -dM -E -O0 - < /dev/null > /tmp/O0.txt $ gcc -dM -E -O3 - < /dev/null > /tmp/O3.txt $ sdiff -s /tmp/O0.txt /tmp/O3.txt #define __NO_INLINE__ 1 < > #define __OPTIMIZE__ 1 

देर उत्तर – मुझे अन्य जवाब उपयोगी मिले – और थोड़ा अतिरिक्त जोड़ना चाहते थे।


मैं एक विशेष हेडर फ़ाइल से आने वाले पूर्वप्रक्रमक मैक्रो कैसे डंप करूं?

 echo "#include <sys/socket.h>" | gcc -E -dM - 

विशेष रूप से, मैं यह देखना चाहता हूं कि मेरे सिस्टम पर सोमेक्सोन को क्या परिभाषित किया गया था मुझे पता है कि मैं सिर्फ मानक हेडर फाइल को खोल सकता था, लेकिन कभी-कभी मुझे हेडर फ़ाइल स्थान ढूंढने के लिए थोड़ा सा खोजना पड़ता है। इसके बजाय मैं सिर्फ एक-लाइनर का उपयोग कर सकता हूं:

 $ echo "#include <sys/socket.h>" | gcc -E -dM - | grep SOMAXCONN #define SOMAXCONN 128 $ 

सरल दृष्टिकोण ( gcc -dM -E - < /dev/null ) जीसीसी के लिए ठीक काम करता है लेकिन जी ++ के लिए विफल रहता है हाल ही में मुझे सी ++ 11 / सी ++ 14 सुविधा के लिए एक परीक्षा की आवश्यकता है। उनके संबंधित मैक्रो नामों की सिफारिशें https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations पर प्रकाशित की गई हैं। परंतु:

 g++ -dM -E - < /dev/null | fgrep __cpp_alias_templates 

हमेशा विफल रहता है, क्योंकि यह चुपचाप सी-चालकों को बोलेगा (जैसा कि gcc द्वारा लागू किया गया है) आप जीसीसी के खिलाफ अपने आउटपुट की तुलना करके या जी -5 – विशिष्ट कमांड लाइन विकल्प (-स्टडी = सी ++ 11) जोड़कर यह देख सकते हैं जो त्रुटि संदेश सीसी 1 cc1: warning: command line option '-std=c++11' is valid for C++/ObjC++ but not for C

क्योंकि (गैर सी ++) जीसीसी कभी "टेम्पलेट एलियांज" का समर्थन नहीं करेगा (देखें http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf ) आपको -x c++ को जोड़ना होगा -x c++ कंपाइलर के अभिविन्यास को लागू करने के लिए -x c++ विकल्प (रिक्त डमी फ़ाइल के बजाय -x c++ विकल्पों का उपयोग करने के लिए क्रेडिट, यूआईआईचाओ पर जाएं, नीचे देखें):

 g++ -dM -E -x c++ /dev/null | fgrep __cpp_alias_templates 

कोई आउटपुट नहीं होगा क्योंकि जी ++ (संशोधन 4.9.1, डिफ़ॉल्ट रूप से-std = gnu ++ 98) सी + + 11-फीचर डिफ़ॉल्ट रूप से सक्षम नहीं करता है। ऐसा करने के लिए, उपयोग करें

 g++ -dM -E -x c++ -std=c++11 /dev/null | fgrep __cpp_alias_templates 

जो अंत में पैदावार

 #define __cpp_alias_templates 200704 

यह देखते हुए कि जी ++ 4.9.1 "टेम्पलेट -std=c++11 " का समर्थन करता है -std=c++11 साथ लागू होता है

अधिक पोर्टेबल दृष्टिकोण जो विंडोज पर समान रूप से अच्छी तरह से काम करता है (जहां कोई / dev / null नहीं है) या लिनक्स:

 echo | gcc -dM -E - 

एक बड़ी परियोजना में काम करते हुए, जिसमें जटिल बिल्डिंग सिस्टम है और जहां जीसीसी / जी ++ आदेश प्राप्त करना (या संशोधित) करना कठिन है, मैक्रो विस्तार का परिणाम देखने का दूसरा तरीका है बस मैक्रो को फिर से परिभाषित करें, और आप निम्न के लिए एक जैसा उत्पादन प्राप्त करेंगे:

 file.h: note: this is the location of the previous definition #define MACRO current_value