2017-05-14 22 views
5

के बीच अंतर मैंने सोचा कि cpp foo.c और gcc -E foo.c स्रोत फ़ाइल को पूर्वप्रदर्शन करते हैं, लेकिन मुझे उनके आउटपुट को एक ही फ़ाइल के लिए अलग करना पड़ा।सीपीपी और जीसीसी-ई

$ cat foo.c 
#define VARIABLE 3 
#define PASTER(x,y) x ## _ ## y 
#define EVALUATOR(x,y) PASTER(x,y) 
#define NAME(fun) EVALUATOR(fun, VARIABLE) 

extern void NAME(mine); 

cpp के लिए परिणाम:

$ cpp foo.c 
# 1 "foo.c" 
# 1 "<built-in>" 1 
# 1 "<built-in>" 3 
# 329 "<built-in>" 3 
# 1 "<command line>" 1 
# 1 "<built-in>" 2 
# 1 "foo.c" 2 





extern void mine ## _ ## 3; 

$ 

gcc -E के लिए परिणाम और clang -E के लिए:

$ gcc -E foo.c 
# 1 "foo.c" 
# 1 "<built-in>" 1 
# 1 "<built-in>" 3 
# 330 "<built-in>" 3 
# 1 "<command line>" 1 
# 1 "<built-in>" 2 
# 1 "foo.c" 2 





extern void mine_3; 
$ 

क्यों उन outputs अलग है, और जो एक का उपयोग करना चाहिए जब मैं देखना चाहता हूँ preprocessed स्रोत?

मूल कोड here

+0

मैंने अभी यह कोशिश की। 'Cpp' का मेरा संस्करण समान आउटपुट को 'gcc -E' के रूप में बनाता है। आपके 'gcc' आउटपुट के समान। – selbie

+2

मुझे 'gcc-e foo.c' के साथ' cpp foo.c' के साथ एक ही परिणाम मिलते हैं। क्या आप प्रश्न में 'cpp -v foo.c' के आउटपुट पेस्ट कर सकते हैं? –

+1

यदि मैं cpp को कमांड लाइन पैरामीटर के रूप में '--traditional-cpp' का उपयोग करता हूं, तो मुझे आपके जैसा ही आउटपुट मिलता है। ऐसा लगता है कि किसी ने पहले से ही पहचान की है कि एक संभावित उत्तर के रूप में। – selbie

उत्तर

2

दोनों के बीच अंतर यह है कि gcc -E-traditional-cpp को समाप्त होगा। यदि आप विकल्प शामिल करते हैं तो आपको cpp के समान परिणाम प्राप्त करना चाहिए।

https://gcc.gnu.org/onlinedocs/cpp/Traditional-Mode.html

+0

वास्तव में है। जीसीसी इस विकल्प को खत्म करने का प्रबंधन कैसे करता है क्योंकि कोई 'पारंपरिक-सीपीपी' नहीं है? – Bilow

+0

कुछ 'cpp' प्रोग्रामों की तरह दिखता है (जैसे कि मेरे वर्कस्टेशन पर एक) को डिफ़ॉल्ट रूप से' -traditional-cpp' 'के लिए बनाया गया है। तो यदि आप 'सीपीपी' का आह्वान करते समय पारंपरिक मोड को बंद करना चाहते हैं, तो कोई विचार यह कैसे करें? मेरा संस्करण शिकायत करता है अगर मैं '-no-पारंपरिक-cpp' या' --no-पारंपरिक-cpp' का उपयोग करने का प्रयास करता हूं। 'Gcc -E' का आह्वान करने के बाद यह चाल सिर्फ मेरे लिए अकादमिक है। –

+0

@ बिल्लो: 'gcc' आमतौर पर इसे तब तक समाप्त करता है जब तक अन्यथा निर्दिष्ट नहीं किया जाता है। –

संबंधित मुद्दे