c++ - सी बनाम सी++ संकलन असंगति-एक प्रकार का नाम नहीं है




gcc g++ (2)

ऐसा लगता है कि आपके पास एक हेडर फ़ाइल है जो C ++ में अवैध है, इसलिए आप इसे C ++ के रूप में संकलित कोड में #include नहीं कर सकते। यदि आप लाइब्रेरी हेडर फ़ाइल में परिवर्तन को प्रभावित नहीं कर सकते हैं (उदाहरण के लिए अपने लाइब्रेरी सप्लायर से शिकायत करके) तो सबसे सीधा विकल्प एक पतली सी ++ लिखना है - लाइब्रेरी के चारों ओर संगत आवरण:

C हेडर के खिलाफ अपने C ++ कोड को अलग करने के लिए, Wrapper.h और Wrapper.c , जहां .h C ++ में शामिल करने के लिए मान्य है, जिसमें Wrapper.c शामिल नहीं है , और आपको लाइब्रेरी इंटरैक्शन के लिए आवश्यक सभी प्रकार और फ़ंक्शन प्रदान करता है। । फिर, .c , आप #include "header.h" को #include "header.h" कर सकते हैं और सभी कॉलों को कार्यान्वित कर सकते हैं (और जो कुछ भी आपको सुरक्षित रूप से प्रकारों के बीच परिवर्तित करने के लिए करने की आवश्यकता है)। यह स्पष्ट रूप से C के रूप में संकलित किया जाएगा, C ++ नहीं।

मैं अपने C ++ एप्लिकेशन के साथ संयोजन में आपूर्तिकर्ता की लाइब्रेरी का उपयोग करने का प्रयास कर रहा हूं। लाइब्रेरी काफी हद तक C पर आधारित है, जो आम तौर पर extern "C" विकल्प के साथ कोई समस्या नहीं है, लेकिन मैं एक ऐसे मुद्दे पर भाग गया जिसे C ++ कंपाइलर स्वीकार नहीं करता है।

मैंने अपना कोड निम्नलिखित उदाहरण फ़ाइलों में सरल किया। शीर्षलेख। यह सुपरियर लाइब्रेरी से एक हेडर का प्रतिनिधित्व करता है, main.c / cpp मेरी अपनी फाइलें हैं। मेरा असली एप्लिकेशन C ++ एप्लिकेशन है, इसलिए मैं इसे main.cpp के साथ काम करना चाहता हूं।

u64 u64; (पंक्ति को u64 u64; ):

#ifndef HEADER_H
#define HEADER_H

#include <stdint.h>

typedef uint64_t u64;

union teststruct {
    u64 u64;
    struct {
        u64 x:32;
        u64 y:32;
    } s;
};

#endif

main.c:

#include <stdio.h>
#include "header.h"

int main() {
    union teststruct a;
    a.u64=5;
    printf("%x\n", a.u64);

    return 0;
}

main.cpp (main.c के समान लेकिन एक अतिरिक्त extern "C" स्टेटमेंट के साथ):

#include <stdio.h>

extern "C" {
#include "header.h"
}

int main() {
    union teststruct a;
    a.u64=5;
    printf("%x\n", a.u64);

    return 0;
}

लाइन का उपयोग करके मुख्य.c संकलित करना

gcc -o test main.c

समस्याओं के बिना संकलन। हालाँकि, कमांड के साथ g ++ कंपाइलर का उपयोग करके C ++ संस्करण का संकलन

g++ -o test main.cpp

निम्नलिखित संकलक त्रुटियाँ देता है:

In file included from main.cpp:12:0:
header.h:11:9: error: u64 does not name a type
         u64 x:32;
         ^
header.h:12:9: error: u64 does not name a type
         u64 y:32;
         ^

मुद्दा यह है कि आपूर्तिकर्ता ने टाइप और वेरिएबल नाम दोनों के लिए एक ही नाम (u64) का उपयोग किया था, जो शुरू करने के लिए एक बुरे विचार की तरह लगता है, लेकिन जीसीसी स्पष्ट रूप से इसे स्वीकार करता है। मैं लाइब्रेरी (यानी शीर्षलेख) को बदलना नहीं चाहता क्योंकि यह बहुत बड़ी है, यह कोड में बहुत कुछ होता है, और मुझे कभी-कभी इसके लिए अपडेट मिलते हैं। क्या जी ++ बनाने के लिए इस संयोजन को स्वीकार करने का एक तरीका है, या हेडर को बदलने के बिना main.cpp को संशोधित करने का एक तरीका है।


यदि C और C ++ के बीच आपकी बताई गई असंगतता केवल एक ही है, तो आपको शीर्ष लेख. header.h को C ++ संगत हेडर फ़ाइल में प्रोग्रामेटिक रूप से परिवर्तित करने में सक्षम होना चाहिए, इसे शीर्षलेख की तरह नाम दें। और फिर आप नए संस्करणों को उसी तरह बदल सकते हैं।

कंपाइलर त्रुटियाँ आपको सब कुछ बताती हैं कि क्या और कहाँ बदलना चाहिए:

header.h:11:9: error: u64 does not name a type
  1. ओपन header.h ;
  2. पद की तलाश 11: 9;
  3. डालें :: वहाँ;
  4. सभी के लिए दोहराएँ does not name a type त्रुटि का does not name a type

कुछ स्ट्रिंग प्रसंस्करण और यह किया जाता है।

PS: C से C ++ कन्वर्टर्स ऐसा करने में सक्षम हो सकते हैं।







g++