साझा वैश्विक चर से C++ लायब्रेरी C के लिए मुख्य कार्यक्रम

0

सवाल

मैं gstdsexample.so, एक C++ पुस्तकालय है । अंदर, यह दो वैश्विक चर है कि मैं साझा करना चाहते हैं, पुस्तकालय के बीच और मुख्य C के लिए कार्यक्रम.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

परीक्षण के दो परिदृश्यों.

परिदृश्य 1

sharedata.h

#ifndef __SHARE_DATA_H__
#define __SHARE_DATA_H__
#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

#endif /* __SHARE_DATA_H__ */

शामिल हैं sharedata.h में gstdsexample.cpp और main.c. संकलन ठीक है, लेकिन मैं एक विभाजन दोष मिलता है जब gstdsexample.cpp करने के लिए डेटा लिखते *ptr.

परिदृश्य 2

घोषित दो चर में

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

तो के रूप में घोषित extern में main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

अब मैं अपरिभाषित संदर्भ त्रुटियों के लिए दो चर जब संकलन main.c.

परिदृश्य 3:

#ifndef __SHARE_DATA_H__
#define __SHARE_DATA_H__
#include <stdio.h>
#include <pthread.h>

extern "C" {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
}


#endif /* __SHARE_DATA_H__ */

फिर में शामिल हैं sharedata.h में gstdsexample.cpp और main.c. के संकलन के लिए सीपीपी उदारीकरण ठीक है । लेकिन संकलन के लिए मुख्य.c गया है, त्रुटियों के रूप में

error: expected identifier or ‘(’ before string constant
 extern "C" {
        ^~~
deepstream_app_main.c: In function ‘all_bbox_generated’:
deepstream_app_main.c:98:24: error: ‘mutex’ undeclared (first use in this function); did you mean ‘GMutex’?
   pthread_mutex_lock( &mutex );
                        ^~~~~
                        GMutex
deepstream_app_main.c:98:24: note: each undeclared identifier is reported only once for each function it appears in
deepstream_app_main.c:101:21: error: ‘ptr’ undeclared (first use in this function); did you mean ‘puts’?
     printf("%d ", *(ptr+x));

कैसे साझा करने के लिए चर के बीच सी++ और सी स्रोत फ़ाइलें?

c++ global-variables
2021-11-24 03:54:36
2

सबसे अच्छा जवाब

1

में एक हेडर फाइल... gstdsexamle.ज

// disable name mangling in C++
#ifdef __cplusplus
extern "C" {
#endif

// declare your two vars in the header file as extern. 
extern pthread_mutex_t mutex;
extern int *ptr;


#ifdef __cplusplus
}
#endif

में gstdsexamle.सी

#include "gstdsexamle.h"

/* only initialise here */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

में मुख्य.सी

#include "gstdsexamle.h"

Thats सब आप की जरूरत है. mutex & पीटीआर अब उपलब्ध हैं में मुख्य.सीपीपी/main.सी

2021-11-24 04:47:45

gstdsexample उदारीकरण ठीक है । लेकिन मुख्य.c अपरिभाषित है त्रुटियों `के रूप में अपरिभाषित संदर्भ के लिए mutex और अपरिभाषित संदर्भ के लिए ptr'
batuman

मैं भी करने की जरूरत है, इस घोषणा में मुख्य.सी pthread_mutex_t mutex; int *ptr;
batuman
0

परिदृश्य 1 और परिदृश्य 2 अमान्य कर रहे हैं, क्योंकि C++ mangles के नाम C++ की पहचान करने के लिए अनुमति देने के लिए पहचानकर्ता से अधिक भार.

परिदृश्य 3 में विफल रहता है क्योंकि extern "C" { } निर्माता एक वाक्यात्मक निर्माण वैध केवल C++में और यह कानूनी नहीं है सी में सक्षम होना करने के लिए ऐसा करने के लिए, आप की जरूरत है पार्स करने के लिए

extern "C" {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
}

इंगित करने के लिए सी++ संकलक है कि वे कर रहे हैं करने के लिए चर हो compatibilized सी के साथ बुला स्कीमा.

लेकिन सी भाषा नहीं है कुछ के बारे में पता से आ रही एक अलग भाषा तो सी में, उन घोषणाओं को प्रदर्शित करना चाहिए के रूप में:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

हेडर फाइल में है, लेकिन बिना अमान्य सिंटैक्स.

एक दृष्टिकोण में उजागर किया गया है anotheer जवाब है, तो मैं विस्तार नहीं समझा क्या कहा जाता है वहाँ, बस करने के लिए कहना है कि __cplusplus__ मैक्रो द्वारा परिभाषित किया गया है संकलक स्वचालित रूप से जब यह है के रूप में अभिनय एक सी++ संकलक, इतना है कि इस्तेमाल किया जा सकता है के रूप में अन्य उत्तर अनुमति देने के लिए शीर्ष लेख फ़ाइल साझा करने के लिए C और C++ घोषणाओं.

2021-11-25 07:26:38

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में