2012-04-28 14 views
10

मेरे पास एक सी प्रोग्राम है जो एक कॉन्स स्ट्रिंग शाब्दिक को संशोधित करने का प्रयास करता है। अब तक मैंने सीखा है कि इसकी अनुमति नहीं है।क्यों clang ++ अलग-अलग व्यवहार से व्यवहार करता है क्योंकि पूर्व बाद के प्रतीक प्रतीक है?

जब मैं clang test.c के साथ कोड संकलित करता हूं तो संकलक कोई चेतावनी नहीं देता है।

test.c:: 6: 15: चेतावनी: स्ट्रिंग के लिए 'चार *' शाब्दिक से रूपांतरण बहिष्कृत है [-Wdeprecated-लिखने योग्य-तार] चार लेकिन जब मैं clang++ test.c साथ यह संकलन यह एक चेतावनी देता है * एस = "हैलो वर्ल्ड";

ll `which clang++` 
lrwxr-xr-x 1 root admin 5 Jan 1 12:34 /usr/bin/[email protected] -> clang 

तो मेरे सवाल का कैसे कर सकता clang++ यह देखते हुए कि यह clang का प्रतीक लिंक है clang से अलग ढंग से व्यवहार करती है: ^

समस्या यह पता चला है कि clang++clang का केवल एक संकेत लिंक है ?

उत्तर

11

क्लैंग अपने argv[0] पर देख रहा है और जो देखता है उसके आधार पर इसके व्यवहार को बदल रहा है। यह एक असामान्य और निराश है, लेकिन दुर्लभ नहीं है, कम से कम 4.2BSD ex और vi के रूप में चाल चल रहा है, जो एक ही निष्पादन योग्य और संभवतः आगे थे।

इस मामले में, clang आपकी .c फ़ाइल को सी के रूप में संकलित कर रहा है, और clang++ इसे C++ के रूप में संकलित कर रहा है। यह एक ऐतिहासिक वार्ट है जिस पर आपको भरोसा नहीं करना चाहिए; उपयुक्त कंपाइलर कमांड और का उपयोग करें सुनिश्चित करें कि आपका फ़ाइल एक्सटेंशन फ़ाइल की वास्तविक सामग्री को प्रतिबिंबित करता है।

+0

क्या आपका मतलब है कि _bash_ 'argv [0] 'को देख रहा है और व्यवहार को बदल रहा है? तो यह मुश्किल है कि 'clang ++' 'clang' से भिन्न व्यवहार करता है? – RockU

+1

क्षमा करें, मैंने पर्याप्त नहीं सोचा था। यह 'clang' में कोडित मुश्किल है। धन्यवाद :) – RockU

+1

क्या मुझे इस तकनीक पर "असामान्य और निराश" होने का उद्धरण मिल सकता है? झुकाव का मतलब नहीं, बस उत्सुक है। –

5

सम्मेलन द्वारा, जिस नाम से कमांड का आह्वान किया जाता है उसे argv[0] के रूप में पास किया जाता है; कार्यक्रमों के आधार पर उनके व्यवहार को बदलने के लिए यह विशेष रूप से असामान्य नहीं है। (ऐतिहासिक, ln, cp, और mv अनुसंधान यूनिक्स पर एक ही निष्पादन के लिए hardlinks थे और argv[0] इस्तेमाल किया जो कार्रवाई करने का फैसला करने के लिए। साथ ही, अधिकांश गोले argv[0] में एक अग्रणी - के लिए देखो अगर वे एक लॉगिन खोल होना चाहिए तय करने के लिए।) अक्सर एक ही प्रभाव (विकल्प, पर्यावरण चर, आदि) प्राप्त करने के लिए कुछ और तरीका भी है; आपको argv[0] गेम खेलने के बजाय सामान्य रूप से इसका उपयोग करना चाहिए।

ऐसा करने के कारण हैं, लेकिन ज्यादातर मामलों में इसका भरोसा करना या इसके आसपास के कार्यक्रमों को डिजाइन करना अच्छा विचार नहीं है।

+0

+1 मुझे परेशान करने के लिए +1। – zwol

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