C से C++ टेबल इनलाइन परिभाषा




gcc g++ (4)

मेरे पास C में कोड है जो सही तरीके से संकलन और काम करता है और मैं C ++ में समान कोड का उपयोग करना चाहूंगा:

static const char* aTable[12] = {
    [4]="seems",
    [6]=" it  ",
[8]="works",};

int main(){
    printf("%s%s%s", aTable[4],aTable[6],aTable[8]); 
    return 0;
}

अब अगर मैं इसे एक .c फ़ाइल में रखता हूं और यह काम करता है gcc साथ संकलन करता है। लेकिन, अगर मैं इसे एक .cpp फ़ाइल में रखता हूं और इसे g++ साथ संकलित करता हूं, तो मुझे निम्नलिखित त्रुटियां मिलती हैं:

test_cpp.cpp:5:3: error: expected identifier before numeric constant
test_cpp.cpp:5:4: error: type '<lambda>' with no linkage used to declare function 'void<lambda>::operator()() const' with linkage [-fpermissive] 
test_cpp.cpp: In lambda function: test_cpp.cpp:5:5: error: expected '{' before '=' token 
test_cpp.cpp: At global scope: test_cpp.cpp:5:5: warning: lambda expressions only available with
    -std=c++0x or -std=gnu++0x [enabled by default] 
test_cpp.cpp:5:6: error: no match for 'operator=' in '{} = "seems"' test_cpp.cpp:5:6: note: candidate is: test_cpp.cpp:5:4: note: <lambda()>&<lambda()>::operator=(const<lambda()>&) 
test_cpp.cpp:5:4: note:   no known conversion for argument 1 from 'const char [6]' to 'const<lambda()>&' 
test_cpp.cpp:6:3: error: expected identifier before numeric constant
test_cpp.cpp:6:4: error: type '<lambda>' with no linkage used to declare function 'void<lambda>::operator()() const' with linkage [-fpermissive]

क्या यह व्यक्त करने का एक तरीका है कि मैं एक लंबो फ़ंक्शन की घोषणा नहीं कर रहा हूं, सिर्फ एक तालिका भरने की कोशिश कर रहा हूं?

मैं निम्नलिखित भाग रखना चाहूंगा:

[4]="seems",
[6]=" it  ",
[8]="works",

क्योंकि यह एक ऑटोजेनरेटेड फ़ाइल से आता है ...


आप C और C ++ कोड आसानी से मिला सकते हैं।

आपको C कोड को C कंपाइलर (gcc) के साथ संकलित रखना चाहिए, शेष कोड C ++ हो सकता है और C ++ कंपाइलर (g ++) के साथ संकलित किया जा सकता है। फिर सभी ऑब्जेक्ट (.o) फ़ाइलों को एक साथ लिंक करें।

इस तरह:

फ़ाइल का नाम: एसी

const char* aTable[12] = {
    [4]="seems",
    [6]=" it  ",
[8]="works",};

फ़ाइल का नाम: b.cpp

#include <cstdio>
extern "C" const char* aTable[12];   
int main(){
    printf("%s%s%s", aTable[4],aTable[6],aTable[8]); 
    return 0;
}

अब संकलित करें:

gcc -c a.c -o a.o
g++ -c b.cpp -o b.o
g++ b.o a.o -o all.out

अब निष्पादन योग्य (all.out) चलाएं और आप देखेंगे कि सब कुछ काम करेगा।

बस ध्यान दें कि फ़ंक्शन के लिए आपको cpp फ़ाइल में घोषणा से पहले extern "C" जोड़ना होगा।


ऐसा करने का कोई तरीका नहीं है। C ++ ने इस विशेष C सिंटैक्स को कभी नहीं अपनाया।

आपके मामले में, चूंकि तालिका स्वतः-जनरेट की गई है, मैं इसे केवल सी फ़ाइल में डालूंगा। जब तक यह static के रूप में चिह्नित नहीं होता है, तब तक इसे बिना समस्याओं के C ++ कोड से एक्सेस किया जा सकता है।


सी + + द्वारा पहले से ही उल्लेख नहीं किए गए नामित आरंभीकरण - यदि आप C ++ पर जोर देते हैं, तो आप एक निर्माण के साथ एक आवरण वर्ग लिख सकते हैं:

class Table
{
    std::array<char const*, 12> data;
public:
    Table()
    {
        data[4] = "seems";
        data[6] = " it  ";
        data[8] = "works";
    }
    char const* operator[](unsigned int index) const
    {
        return data[index];
    }
} aTable;

कोड का परीक्षण नहीं किया था, इसलिए यदि आप बग ढूंढते हैं, तो इसे स्वयं ठीक करने के लिए स्वतंत्र महसूस करें ...


[4]= एक निर्दिष्ट इनिशियलाइज़र है , C ++ द्वारा समर्थित सी विशेषताओं में से एक है।

यहां एक list दी गई है जो यह बताने की कोशिश करती है कि C99 की कौन सी विशेषताएँ C ++ 17 द्वारा समर्थित हैं। नीचे देखने के लिए नीचे स्क्रॉल करें कि कौन से समर्थित नहीं हैं।

यह महसूस करना महत्वपूर्ण है कि C ++ किसी भी तरह C का सुपरसेट नहीं है।





g++