แบ่งปันโกลบอลตัวแปรจาก 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. Compilation โอเคแต่ฉันได้ segmentation ความผิดที่ 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. รวบรวมสำหรับ cpp lib ยบร้อยดี แต่รวบรวมสำหรับหลัก.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++language และ C แหล่งแฟ้ม?

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

คำตอบที่ดีที่สุด

1

ในส่วนหัวแฟ้ม...gstdsexamle.h

// 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.c

#include "gstdsexamle.h"

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

ในหลัก.c

#include "gstdsexamle.h"

พวกผู้ชมน่ะได้ยินพวกเธอทั้งหมดที่คุณต้องการ. mutex&ptr ตอนนี้ที่มีอยู่ในหลัก.cpp/หลัก.c

2021-11-24 04:47:45

gstdsexample lib ยบร้อยดี แต่หลัก.ซีได้ทำดัชนีเทียบสีผิดพลาดที่`ยังไม่ระบุการอ้างอิงไป mutex และยังไม่ระบุการอ้างอิงไป ptr'
batuman

ฉันยังต้องการที่จะประกาศนี้อยู่ในหลัก.c pthread_mutex_t mutex; int *ptr;
batuman
0

สถานการณ์ 1 และสถานการณ์ 2 เป็นไม่ถูกต้องเพราะ C++mangles ชื่อของ C++identifiers เพื่ออนุญาตให้สำหรับแสดงตัวมากเกินไป

สร้างสถานการณ์จำลอง 3 ล้มเหลวเพราะคน extern "C" { } constructor เป็น syntactic ก่อสร้างที่ใช้งานได้ เพียงทางเดียว C++ และมันไม่ถูกกฎหมายอยู่ใน C เป็นต้องทำอย่างนี้,คุณต้องการวิเคราะห์

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

ต้องบอก C++คอมไพเลอร์ว่าพวกเขาเป็นตัวแปรที่จะเป็น compatibilized กับ C เรียกชุดรูปแบบ.

แต่ C ภาษาที่ไม่รู้เรื่องบางอย่างที่มาจากต่างออกภาษาดังนั้นใน C พวกนั้น declarations ต้องทำให้ดูเหมือนว่าเป็น:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

ในส่วนหัวแฟ้มแต่ไม่มีที่ไม่ถูกต้องรูปแบบการสั่งงาน.

การเข้าถึงถูกเปิดเผยใน anotheer คำตอบดังนั้นฉันจะไม่ยืดเวลาอธิบายมันคืออะไรบอกว่ามีแค่ต้องพูดแบบนั้น __cplusplus__ มาโครถูกกำหนดโดยที่คอมไพเลอร์โดยอัตโนมัติเมื่อมันทำหน้าที่เป็น C++คอมไพเลอร์ดังนั้นสามารถใช้ที่อยู่อีกคำตอบจะอนุญาตให้ส่วนหัวแฟ้มที่จะแบ่งปัน C และ C++declarations.

2021-11-25 07:26:38

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่