2015-07-02 5 views
5

विंडोज़ के तहत-डी कंपाइलर परिभाषित चर से स्ट्रिंग शाब्दिक बनाने के लिए कैसे करें, मेरे पास एक पर्यावरण चर है जिसमें विंडोज-शैली पथ है। मैं अपने कार्यक्रम में उस पथ को बनाना चाहता हूं और इसे प्रिंट करना चाहता हूं। तो यदि मेरा पथ c: \ top है, तो मैं इसे -DTOP = $ (TOP) का उपयोग करके कंपाइलर में पास करता हूं। नोट मैं इसे संकलक में पास करने से पहले इसे c: \\ शीर्ष में परिवर्तित नहीं कर सकता।विंडोज़ पथ

#define WRAP1(X) #X 
#define WRAP(X) WRAP1(X) 
char path[] = WRAP(TOP); 

:

char path[]="c:\\top"; 

मैं सिर्फ stringafication ऑपरेटर का उपयोग नहीं कर सकते हैं:

#define TOP=c:\top 

मैं के बराबर हैं:

अभी, मैं के बराबर है यह केवल "c: \ top" स्ट्रिंग में परिणाम देता है जो संकलक दृश्य को बचने के अनुक्रम के रूप में देखता है (यानी \ t)।

मुझे लगता है कि एक स्ट्रिंग अक्षर बनाने के लिए एक संभावित समाधान होगा, लेकिन अन्य समाधान भी ठीक होंगे। वहां एक स्ट्रिंग शाब्दिक निर्माण करने के लिए मैक्रो का उपयोग करने के लिए है कि लाभ होगा एक रास्ता है:। "या()

char path[] = R"foo(c:\top)foo"; 

अब तक, मेरे सभी प्रयास के रूपांतरों को शामिल कारणों से विफल हो या \

धन्यवाद।

+1

"नोट मैं इसे संकलक में पास करने से पहले इसे c: \\ शीर्ष में परिवर्तित नहीं कर सकता" - क्यों? –

+0

क्यों नहीं '-DTOP = R "foo ($ (TOP)) foo"' इसके बजाय? संपादित करें: उद्धरणों को बचने की आवश्यकता हो सकती है क्योंकि यह एक कमांड लाइन विकल्प है, जैसे: '-DTOP =" R "" foo ($ (TOP)) foo "" – Cameron

+0

मैं कस्टम संकलन वातावरण में हूं I बदल नहीं सकते जब मैं-डी निर्दिष्ट करता हूं तो मैं अतिरिक्त उद्धरणों का उपयोग नहीं कर सकता। कंपाइलिंग पर्यावरण कंपाइलर को अतिरिक्त अनुक्रमों को पार्स करने के लिए उद्धरणों का भी उपयोग कर रहा है। – shol74

उत्तर

1

आप अपने परिभाषित पथ को स्ट्रिंगिंग ऑपरेटर # के साथ उपसर्ग करके स्ट्रिंग में परिवर्तित कर सकते हैं। हालांकि, यह केवल मैक्रोज़ में काम करता है। आपको वास्तव में इसे ठीक से काम करने के लिए डबल-मैक्रो की आवश्यकता होती है, अन्यथा यह केवल शीर्ष प्रिंट करता है उद्धरण में पथनाम रखकर महत्वपूर्ण है - ओह उदाहरण में पथ है

/DTOP="\"$(PathDirName)\\"" 

कोड

#define STRINGIZE2(x) #x 
#define STRINGIZE(x) STRINGIZE2(x) 

char path[] = STRINGIZE(TOP); 

यह मेरे लिए काम किया है के भीतर का उपयोग करना - env ​​PathDirName

संकलक के लिए पथ निर्धारित तहत संग्रहीत। आप लगभग यह काम कर रहे थे, तो उम्मीद है कि यह मदद करता है।

[संपादित करें] मैं अब समस्या देख सकता हूं - सी: \ शीर्ष के भीतर - यह 'बैकस्लैश टी' को एक नियंत्रण कोड - '\ t' के रूप में ले रहा है। यह एपॉर्च काम करने के लिए एक दुःस्वप्न का थोड़ा सा हिस्सा बन रहा है - क्योंकि आपको वास्तव में दो स्लेश के साथ फ़ाइल नाम बनाने की आवश्यकता है या आगे की स्लैश का उपयोग करें। मुझे लगता है कि पूरी तरह से समीक्षा करने से पहले मैंने जवाब देकर मुद्दों को भ्रमित कर दिया है। मैंने कई तरीकों का प्रयास किया है - लेकिन पारित परिभाषित करने में सक्षम नहीं होने के कारण - मैं केवल रेगेक्स लाइब्रेरी या स्ट्रिंग स्कैनिंग मैनुअल का उपयोग करने का सुझाव दे सकता हूं - नियंत्रण गुणकों को सही '\' अक्षर के साथ बदलना।

मैंने आपके उदाहरण में '\ t' के साथ इसे दिखाने वाला एक उदाहरण खारिज कर दिया है - यह अच्छा कोड नहीं है, यह समझाया गया है कि क्या किया जा रहा है, उम्मीद है कि यह एक दृश्य उदाहरण देता है और यह करता है (इसमें इतना अच्छा तरीका नहीं है) 'सी: \ टॉप' के साथ एक समस्या को हल करें .. जैसा कि मैंने कहा है - अगर इस खांसी, विधि का उपयोग करते हैं, तो आपको सभी नियंत्रण कोडों को संभालने की आवश्यकता होगी।:-)

char stringName[256]; 
char* pRefStr = STRING(TOP); 
char* pDestStr = stringName; 
int nStrLen = strlen(pRefStr); 

for(int nIndex = 0; nIndex < nStrLen; nIndex++) 
{ 
    if (*pRefStr == '\t') 
    { 
     *pDestStr++ = '\\'; 
     *pDestStr++ = 't'; 
     pRefStr++; 
    } 
    else 
    { 
     *pDestStr++ = *pRefStr++; 
    } 
} 
*pDestStr = '\0'; 

एक बार फिर - किसी भी भ्रम के लिए खेद है - मैं अपने जवाब यहाँ संदर्भ के रूप में आप के लिए छोड़ दिया है - और उम्मीद है कि किसी को नियंत्रण charactors साथ परिभाषित स्ट्रिंग (से निपटने का एक तरीका के साथ ऊपर आ जाएगा)।

धन्यवाद, नील

+0

धन्यवाद, लेकिन फिर से, मैं जो भी पारित कर रहा हूं उसे बदल नहीं सकता। मैं सोच रहा था कि क्या मैं स्ट्रिंग अक्षर बनाने के लिए कंसट स्ट्रिंग ऑपरेटरों ## someway का उपयोग कर सकता हूं। – shol74

+0

हम्म के रूप में यह एक मैक्रो है - आप पहले और बाद में उद्धरण जोड़ने का प्रयास कर सकते हैं। मैं कोशिश नहीं कर सकता क्योंकि मैं अपनी देव मशीन से दूर हूं - इसलिए इसे काम करना चाहिए। एक तरीका coud प्रारूप का उपयोग कर रहे हैं (..) - अगर मैं अपनी मशीन के पास आता हूं तो मुझे यह कोशिश करने के लिए जाना होगा। – Neil

+0

मैंने अपना जवाब shol74 संपादित किया है, अच्छी खबर नहीं है क्योंकि मैं यह समझने में असमर्थ हूं कि शीर्ष परिभाषित करने के दौरान '\ t' गुणक कैसे नहीं प्राप्त किया जाए। जैसा कि मैंने उल्लेख किया - उम्मीद है कि कोई इसे काम करने में सक्षम होगा। मैं गंभीरता से परिभाषित परिभाषा को बदलने और बदलने की कोशिश करता हूं। – Neil

0

बल्कि विचित्र वाक्य रचना आप ऑन-द-मक्खी चर विस्तार में प्रतिस्थापन सबस्ट्रिंग प्रदर्शन के लिए देख रहे हैं, साथ ही कुछ उद्धरण परिभाषा एक स्ट्रिंग बनाने के लिए भागने निशान। मुझे सबस्ट्रिंग प्रतिस्थापन जानकारी here मिली।

set DIR=C:\WINDOWS env var सेट हो जाता है, और फिर हम एक परीक्षण prog है:

#include <stdio.h> 

#define STR(x) #x 
#define STRING(x) STR(x)  

int main(int argc, char* argv[]) 
{ 
    printf("DIR: %s\n", STRING(DIR)); 
    return 0; 
} 

आप खोल में बोली नहीं कर सकते हैं, आप यहाँ stringize कर सकते हैं, लेकिन आप अभी भी चर-स्ट्रिंग प्रतिस्थापन करना चाहिए।

cmd.exe के माध्यम से में env var दर्रा:

gcc -Wall -DDIR=%DIR:\=\\% main.c 

अधिक जानकारी के लिए ऊपर दिए गए लिंक देखें, या बदलने सबस्ट्रिंग गूगल। मुझे फ़ंक्शन पर किसी भी Microsoft जानकारी का कोई लिंक नहीं मिल रहा है (क्या आश्चर्य है!)

+0

फिर से, मैं पहले से ही उद्धरण वर्णों का उपयोग कर रहे कस्टम निर्माण वातावरण के कारण इसे पार करने से पहले स्ट्रिंग को बदल नहीं सकता। तो वहां कोई भी उद्धरण वर्ण जोड़कर वहां मेरी स्ट्रिंग को जल्दी ही समाप्त कर दिया गया है। मुझे .cpp फ़ाइल में #define शीर्ष c: \ top के साथ काम करने की आवश्यकता है। – shol74

+0

@ shol74 मैंने संकलन कमांड लाइन से उद्धरण चिह्नों को निकालने के लिए संपादित किया है। एक अजीब आवश्यकता की तरह लगता है। जैसा कि नील ने नोट किया था, आप मैक्रो विस्तार का उपयोग कर इसे स्ट्रिंग कर सकते हैं। –

+0

@ shol74 मुझे लगता है कि आप असंभव के लिए पूछ रहे हैं क्योंकि प्रीप्रोसेसर के साथ काम करने के लिए कोई समझदार एन्कोडिंग नहीं है, और प्रीप्रोसेसर आपके पास एकमात्र टूल है। –

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