2011-01-20 20 views
18

में फ़ाइल नाम शामिल करें मैं मैक्रो में फ़ाइल नाम शामिल करने की कोशिश कर रहा हूं। यह C++ कानूनी माना जाता है:उत्पन्न करें मैक्रो

#define INCLUDE_FILE "module_impl_win.hpp" 
#include INCLUDE_FILE 

इस ठीक काम करता है, लेकिन जैसे ही मैं उत्पन्न फ़ाइल नाम करने की कोशिश यह

#define INCLUDE_FILE(M) M##"_impl_win.hpp" 
#include INCLUDE_FILE("module") 

संकलित करने के लिए failes वास्तव में यह मेरे MSVC2010

पर चेतावनी देता है

चेतावनी C4067: अप्रत्याशित टोकन निम्नलिखित पूर्वप्रक्रमक निर्देश - उम्मीद एक नेवलिन

लेकिन इसमें फ़ाइल शामिल नहीं है।

समस्या क्या है? मुझे इससे कैसे छुटकारा मिल सकता है?

उत्तर

18

मैं इसे एक सहायक उद्धरण मैक्रो का उपयोग करके करूँगा। कुछ इस तरह आप दे देंगे आप क्या चाहते हैं:

#define QUOTEME(M)  #M 
#define INCLUDE_FILE(M) QUOTEME(M##_impl_win.hpp) 

#include INCLUDE_FILE(module) 
+1

आपको इस दृष्टिकोण से सावधान रहना होगा।'_impl_win' एक पहचानकर्ता टोकन है और चूंकि यह अंडरस्कोर से शुरू होता है (और मैक्रो नेमस्पेस में है), यह कार्यान्वयन के लिए आरक्षित है। आपको अग्रणी '_' को तोड़ना चाहिए और इसे अलग से जोड़ना चाहिए, हालांकि मेरे सिर के ऊपर से मुझे यकीन नहीं है कि यह कैसे करना है क्योंकि' _' स्वयं एक आरक्षित पहचानकर्ता है। –

+1

बीटीडब्ल्यू, यह पोर्टेबल कितना है? – ledokol

+0

@ जेम्स मैकनेलिस: मानक रिजर्व केवल अंडरस्कोर के साथ नाम के बाद अपरकेस वर्ण (या डबल अंडरस्कोर वाले नाम) के नाम हैं। मुझे नहीं पता कि क्यों सटर हर जगह अंडरस्कोर का उपयोग करने से बचने की सिफारिश करता है .. – ledokol

3

समस्या यह है कि अंत में अपने कोड इस प्रकार दिखाई देगा है:

#include "module""_impl_win.hpp" 

यह वही चेतावनी उत्पन्न करता है और त्रुटि आप देख रहे हैं लेकिन इसके लिए थोड़ी और अधिक स्पष्ट तरीके से।

संकलक कि वाक्य रचना को स्वीकार करते हैं, पूर्वप्रक्रमक नहीं होगा।

मैं तुम्हें काम करने के लिए कोशिश कर रहे हैं बनाने के लिए एक सुझाव नहीं है। व्यक्तिगत रूप से उस प्रकार के मैक्रो का उपयोग नहीं करना चाहेंगे क्योंकि इससे कोड को नेविगेट करना अधिक कठिन हो जाता है और यह संभवतः कोड को नेविगेट करने से कई संपादकों को रोक देगा।

+0

धन्यवाद, यह नहीं पता था कि यह इस तरह के तारों को जोड़ता है। कल्पना कीजिए कि वहां कई फाइलें हैं जिनमें #ifdef ... #endif के साथ प्लेटफ़ॉर्म विशिष्ट शीर्षलेख शामिल हैं। यदि कल मैं एक और मंच के लिए समर्थन जोड़ूंगा तो मुझे केवल एक मैक्रो संपादित करने और प्लेटफ़ॉर्म विशिष्ट कार्यान्वयन फ़ाइलों को जोड़ने के बजाय इन सभी फ़ाइलों को संपादित करने की आवश्यकता होगी। यह दुख की बात है। – ledokol

+0

@ledokol: प्लेटफ़ॉर्म-विशिष्ट कार्यक्षमता को अलग-अलग शीर्षकों और स्रोत फ़ाइलों में क्यों विभाजित नहीं किया जा सकता है जो कहीं और शामिल नहीं हैं? प्लेटफार्म-विशिष्ट और प्लेटफॉर्म-निर्भर कार्यक्षमता को फ़ाइलों के अपेक्षाकृत छोटे सेट में समेकित करना आसान होना चाहिए। –

+0

क्या आपका मतलब है कि पीआईएमपीएल का उपयोग मंच विशिष्ट कोड को अलग करने के लिए क्यों नहीं किया जाता है? खैर, यह हर जगह इस्तेमाल नहीं किया जा सकता है। ऐसे कई टेम्पलेट वर्ग हैं जिन्हें प्लेटफ़ॉर्म विशिष्ट कार्यान्वयन कक्षा घोषणा की आवश्यकता होती है। इसलिए मुझे इसे हेडर और कार्यान्वयन फाइलों में विभाजित करना है। – ledokol

3

तुम भी बूस्ट का उपयोग कर सकते हैं प्रीप्रोसेसर, विशेष रूप से BOOST_PP_STRINGIZE/BOOST_PP_CAT मैक्रो:

#include <boost/preprocessor/cat.hpp> 
#include <boost/preprocessor/stringize.hpp> 

#define INCLUDE_FILE(M) BOOST_PP_STRINGIZE(BOOST_PP_CAT(M, _impl_win.hpp)) 

// expands to: #include "module_impl_win.hpp" 
#include INCLUDE_FILE(module) 

(cf. C Macro - DynamiC#include)

ध्यान दें कि यह @ एंड्रयू के उत्तर (अग्रणी underscore = आरक्षित पहचानकर्ता) के रूप में एक ही समस्या से पीड़ित है।

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