문제

프로젝트에서 나는 C++와 stdbool.h를 사용하는 C 라이브러리 사이를 인터페이스하고 있습니다.

#ifndef _STDBOOL_H
#define _STDBOOL_H

/* C99 Boolean types for compilers without C99 support */
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */
#if !defined(__cplusplus)

#if !defined(__GNUC__)
/* _Bool builtin type is included in GCC */
typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
#endif

#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1

#endif

#endif

일부 구조에는 bool 회원.따라서 C++ 함수 내에서 로컬 변수로 정의된 이러한 구조 중 하나가 있고 이를 C 함수에 전달하면 bool은 C++에서는 1바이이고 C에서는 4이기 때문에 C++와 C 간에 크기가 일치하지 않습니다.

내 현재 솔루션에 의존하지 않고 이 문제를 극복하는 방법에 대한 조언이 있는 사람이 있습니까?

//#define bool _Bool
#define bool unsigned char

이는 C99 표준에 위배됩니다. stdbool.h

도움이 되었습니까?

해결책

보다 호환 가능한 구현을 찾아서 내 질문에 대한 답을 찾았습니다. stdbool.h 이는 C99 표준을 준수합니다.

#ifndef _STDBOOL_H
#define _STDBOOL_H

#include <stdint.h>

/* C99 Boolean types for compilers without C99 support */
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */
#if !defined(__cplusplus)

#if !defined(__GNUC__)
/* _Bool builtin type is included in GCC */
/* ISO C Standard: 5.2.5 An object declared as 
type _Bool is large enough to store 
the values 0 and 1. */
/* We choose 8 bit to match C++ */
/* It must also promote to integer */
typedef int8_t _Bool;
#endif

/* ISO C Standard: 7.16 Boolean type */
#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1

#endif

#endif

이것은 다음에서 가져온 것입니다. Ada 클래스 라이브러리 프로젝트.

다른 팁

여기서 일관성이 없는 것은 크기만이 아닙니다.C++에서 bool은 키워드이며 C++에서는 bool이 1 또는 0의 값만 보유할 수 있고 그 외에는 아무것도 보유할 수 없음을 보장합니다.C는 이러한 보장을 제공하지 않습니다.

즉, C와 C++ 간의 상호 운용성이 중요한 경우 C++에 대해 동일한 부울을 정의하고 내장 부울 대신 이를 사용하여 C의 사용자 정의 부울을 에뮬레이션할 수 있습니다.이는 버그가 있는 부울과 C 부울과 C++ 부울 간의 동일한 동작 사이의 절충안이 될 것입니다.

논리적으로 bool에 대한 선언이 충돌하여 C와 C++ 간에 소스 코드를 공유하고 서로 링크하도록 할 수 없습니다.

코드와 링크를 공유할 수 있는 유일한 방법은 중개 데이터 구조를 이용하는 것입니다.불행하게도 제가 아는 바로는 C++ 프로그램과 C 라이브러리 간의 인터페이스를 정의하는 코드를 수정할 수 없습니다.가능하다면 다음과 같은 것을 사용하는 것이 좋습니다.

union boolean {
   bool value_cpp;
   int  value_c;
}; 

// 패딩이 필요할 수 있음 엔디안

그 효과는 두 언어 모두에서 데이터 유형을 동일한 너비로 만드는 것입니다.원시 데이터 유형으로의 변환은 양쪽 끝에서 수행되어야 합니다.라이브러리 함수 정의에서 부울 사용을 바꾸고 변환할 라이브러리의 바이올린 코드를 바꾸면 작업이 완료됩니다.

따라서 대신에 해야 할 일은 틈 메우는 나무 C++ 프로그램과 C 라이브러리 사이.

당신은:

extern "C" bool library_func_1(int i, char c, bool b);

그리고 다음을 생성해야 합니다.

bool library_func_1_cpp(int i, char c, bool b)
{
   int result = library_func_1(i, c, static_cast<int>(b));
   return (result==true);
}

이제 대신 library_func_1_cpp를 호출하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top