2010-06-02 10 views
5

संभव डुप्लिकेट:
Use the keyword class as a variable name in C++सी ++ 'नए' कीवर्ड और सी

एक पुस्तकालय मैं चर में से एक का उपयोग कर रहा की एक सी हेडर फाइल में नामित किया गया है 'नए' । दुर्भाग्यवश, मैं इस लाइब्रेरी को सी ++ प्रोजेक्ट में उपयोग कर रहा हूं और 'नए' के ​​अवसर को एक परिवर्तनीय नाम के रूप में संकलक से बाहर कर देता हूं। मैं पहले से ही बाहरी "सी" {# शामिल < ...>} का उपयोग कर रहा हूं, लेकिन यह इस संबंध में मदद नहीं करता है।

क्या मुझे लाइब्रेरी डेवलपर को उस चर के नाम को बदलने के लिए है, भले ही उसके परिप्रेक्ष्य से सी डेवलपर के रूप में, कोड बिल्कुल ठीक है, क्योंकि 'नया' सी कीवर्ड नहीं है?

+1

एक पुस्तकालय डेवलपर ने वैश्विक चर 'नया' नाम देने का निर्णय लिया? – dreamlax

+1

मुझे लगता है कि यह मूल रूप से http://stackoverflow.com/questions/2841204/use-the-keyword-class-as-a-variable-name-in-c – sbi

+0

डैन का डुप्लिकेट है। आपको वह कैसे मिला, एसबीआई? मैंने वास्तव में पोस्ट करने से पहले एक जवाब खोजने की कोशिश की, लेकिन उस सवाल पर कभी नहीं आया। – Florian

उत्तर

3

यह आवश्यक है कि शीर्ष लेख इस वेरिएबल का नाम शामिल है? यदि आप "नया" नामक वैश्विक चर का उपयोग कर रहे हैं, तो निश्चित रूप से यह एक कारण होगा कि आपके पास वैश्विक रूप से दृश्यमान चर नाम हो। दूसरी तरफ, यदि यह "नया" नामक फ़ंक्शन तर्क जैसा कुछ है, तो फ़ंक्शन की घोषणा से नाम हटाएं। यदि नाम संरचना या संघ का सदस्य है, तो हेडर फ़ाइल में इसे बदलना सी कोड को तब तक नुकसान नहीं पहुंचाएगा जब तक सी कोड उस स्रोत कोड से मेल खाने वाले नाम के साथ "निजी" परिभाषा को देखता है।

.सी फ़ाइलों के बाद हेडर फाइल फिक्सिंग ", नए 'सी वाक्य रचना में संकलित किया जाना चाहिए और इस प्रकार नामित चर के साथ सामना करने में सक्षम हो जाएगा एक वैध काम के आसपास होना चाहिए।

लंबी अवधि के लिए, हाँ आप पुस्तकालय डेवलपर के ध्यान में लाना चाहिए।

एक अंतिम, कुछ हद तक hacky, समाधान के रूप में, आप 'नई' कुछ करने के लिए, उदाहरण के लिए, से हेडर फाइल को बदल सकता है "was_new।" और लाइब्रेरी की सी फाइलों को संकलित करते समय #define new was_new को लागू करने के लिए कंपाइलर स्विच का उपयोग करें।

+0

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

0

आप एक 3 पार्टी पुस्तकालय का एक बिल्कुल ठीक हेडर फाइल को संशोधित कर रहे हैं, मैं सलाह देते हैं कि अब आप रोक चाहते हैं। यदि आप मुझे सही समझते हैं, तो आप सी पुस्तकालय में सी ++ कोड जोड़ने का प्रयास कर रहे हैं, ऐसा नहीं होगा, सी "नया" कीवर्ड नहीं पहचानता क्योंकि यह एक सी ++ कीवर्ड है।

इसके बजाय मुझे लगता है कि सलाह देते हैं:

आप एक स्रोत फ़ाइल (* सीपीपी) के साथ एक अलग सी ++ प्रोजेक्ट बनाते हैं, कि 3 पार्टी हेडर फाइल के लिए #include जोड़ सकते हैं और लिंक ("जोड़ने libs" गूगल आदि) पुस्तकालय की बाइनरी फ़ाइल आपके प्रोजेक्ट में।

मुझे आशा है कि हेडर फाइल सहित से पहले थोड़ा, चीयर्स

+0

असल में मैं सी हेडर फ़ाइल को बिल्कुल संशोधित नहीं करना चाहता, क्योंकि यह लाइब्रेरी का हिस्सा है। मैं ऐसे समाधान की तलाश कर रहा था जो केवल मेरे खुद को बदलने पर निर्भर करता है सी ++ स्रोत कोड। पुस्तकालयों को लिंक नहीं करना समस्या है, लेकिन सी ++ स्रोत कोड संकलित करना मेरी खुद की परियोजना, क्योंकि इसमें अभी भी लाइब्रेरी से सी हेडर शामिल हैं, और वे - वैध सी होने के दौरान - वैध C++ मान्य नहीं हैं। – Florian

7

मदद करता है, new नाम बदलने के लिए पूर्वप्रक्रमक का उपयोग करें:

#define new mynew 
#include <...> 
#undef new 

कि संकलन आगे बढ़ने के लिए अनुमति देगा।

आप वास्तव में इस चर का उपयोग करने की जरूरत है? यदि नहीं - तो आप कर चुके हैं। यदि आप करते हैं, तो आप आप सी सब कुछ में अपने स्वयं के आवरण कार्यों है कि आप का उपयोग करें कि स्पर्श करेगा पुस्तकालय लिखा जाएगा लिख ​​सकता है पुस्तकालय के लिए ग फ़ाइलों यह सुनिश्चित करना होगा

-Dnew=mynew 
+0

और फिर उम्मीद है कि पहले से ही एक मौजूदा चर नहीं है जिसे 'mynew' कहा जाता है :) – dreamlax

+0

मुझे इसे एक्सेस करने की आवश्यकता नहीं है, यह फ़ंक्शन घोषणा में केवल एक पैरामीटर है। मैं देखता हूं कि आपका शीर्षक कहां है: क्योंकि प्रीप्रोसेसर 'mynew' द्वारा 'new' को प्रतिस्थापित करता है, इसलिए C++ कंपाइलर कभी भी हेडर फ़ाइल में 'नया' नहीं देखता है, लेकिन केवल 'mynew' है, जो C++ कीवर्ड नहीं है और इसलिए उपयोग करने के लिए ठीक है। – Florian

+0

और सपने देखने के जवाब में: यदि केवल "-Dnew = mynew" भाग का उपयोग करें, तो केवल समस्या का कारण बनना चाहिए। पहला भाग पूरी तरह से ठीक होना चाहिए और मेरे मामले में पर्याप्त होना चाहिए। – Florian

1

साथ संकलित किए जाते हैं सी ++ दोस्ताना हेडर फाइलों के साथ सी में।तो, के बजाय:

 
other_lib.h: 
int foo(int new); 

my_app.cxx: 
extern "C" { 
#include <other_lib.h> 
} 

जो संकलन नहीं होगा, है न:

एक सी संकलक के साथ
 
my_wrap.h: 
#ifdef __cplusplus 
extern "C" { 
#endif 
int my_foo(int); 
#ifdef __cplusplus 
} 
#endif 

my_wrap.c: 
#include <other_lib.h> 
int my_foo(int x) { return foo(x); } 

my_app.cxx: 
#include "my_wrap.h" 

... 

संकलित my_wrap.c, तो सी ++ संकलक साथ my_app.cxx संकलन। यह आपको मौजूदा लाइब्रेरी में कोई परिवर्तन करने के दौरान निर्माण करने की अनुमति देता है।