c로 내 보낸 C ++ 함수의 클래스에 'bool'유형 또는 불투명 포인터를 사용할 수 있습니까?

바룩

내가 쓰고있는 라이브러리의 API를 작업 중입니다. 도서관 자체에 기록됩니다 c++,하지만 API를 사용하여 내보낼 extern "C"최고의 언어 간 호환성 (I은 나중에 API를 소모 될 것이다 C#, C++어쩌면, C그리고 몇 가지 다른).
분명히 API는 전체 클래스 또는 기타 c++특정 기능 (예 : 예외 발생)을 포함 할 수 없지만 내 질문은 다음과 같습니다.

  1. bool내 보낸 API에서 유형을 사용할 수 있습니까 ? 결국 POD입니다.
  2. 불투명 포인터를 클래스에 사용할 수 있습니까? 그렇다면 헤더 파일을 C코드 에서 사용할 수 있도록 헤더 파일에 어떻게 선언해야 합니까?
바룩

나는 마침내 계속해서 그것을 테스트했습니다. 다음은 테스트 프로그램입니다.

test_cpp.cpp;

#include "test.h"

class C {
    int a;
public:
    C() : a(42) {}
    int  getA() { return a; }
    void setA(int v) { a=v; }
};

int get7(bool b) { return b ? 7 : 3; }

C c;
C* getC() { return &c; }
int  getA(C* t) { return t->getA(); }
void setA(C* t, int v) { return t->setA(v); }

test_c.c :

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

int main()
{
    C* c = getC();
    printf("%d\n", getA(c));
    setA(c, 10);
    printf("%d\n", getA(c));
    printf("%d\n%d\n%d\n%d\n", get7(0), get7(1), get7(2), get7(-1));

    return 0;
}

test.h :

#ifdef __cplusplus
extern "C" {
#else
#define bool _Bool
#endif

struct C;
typedef struct C C;

int get7(bool b);

C* getC();
int  getA(C* t);
void setA(C* t, int v);

#ifdef __cplusplus
}
#endif

Windows에서 mingw64 gcc-4.9.0으로 컴파일

gcc -c test_c.c
g++ test_cpp.cpp test_c.o

제대로 컴파일되고 실행되었습니다. 가볼만한 곳:

  • g++Ca로 선언 struct되고 나중에 a 로 정의 되는 데 전혀 문제가 없었 습니다.class
  • C ++ boolc_Bool은 서로 바꿔서 작동했습니다.

MS 컴파일러 (VS2012)로 시도했는데 설명 할 수없는 작은 세부 사항을 제외하고는 동일하게 작동했습니다. 헤더 파일에서 변경해야했습니다.

int get7(bool b);

...에

int get7(bool);

컴파일 할 수 있습니다. 누구든지 이것을 설명 할 수 있다면 나는 그것을 이해하게되어 기쁠 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

해당 클래스 C ++의 멤버 함수 내에서 클래스를 사용할 수 있습니까?

분류에서Dev

C ++에서 함수의 반환 유형으로 포인터 또는 참조를 사용하는 것에 대한 경험 규칙이 있습니까?

분류에서Dev

구조 유형 매개 변수를 사용하여 C ++ dll의 내 보낸 함수를 호출하는 powershell

분류에서Dev

C ++에서 벡터 (또는 다른 유사한 데이터 유형)에 대한 사용자 반복 클래스를 작성할 수 있습니까?

분류에서Dev

c 함수에서 내 보낸 환경 변수를 부모 셸에서 사용할 수 있는지 여부

분류에서Dev

C ++에서 한 클래스의 포인터를 다른 클래스의 포인터로 캐스팅 할 수있는 이유는 무엇입니까?

분류에서Dev

콜백으로 사용할 C ++에서 C # DLL 로의 관리되지 않는 내보내기를 사용하여 함수 포인터를 보내는 방법

분류에서Dev

C ++의 다른 템플릿 함수에서 템플릿 클래스에 속하는 중첩 유형을 어떻게 사용할 수 있습니까?

분류에서Dev

상주 .c 파일에서 액세스 할 수없는 불투명 포인터

분류에서Dev

C ++ 14는 고유 포인터에서 상속 된 클래스의 복사 생성자 또는 operator =를 호출 할 수 없습니다.

분류에서Dev

명령 줄 또는 bash 스크립트 파일을 통해 Talend에서 내 보낸 작업의 매개 변수를 어떻게 전달할 수 있습니까?

분류에서Dev

python3 하위 프로세스에서 내 보낸 bash 함수를 사용할 수없는 이유는 무엇입니까?

분류에서Dev

유형 또는 클래스에 대해 오버로드 된 operator <<가 있는지 확인할 수 있습니까?

분류에서Dev

클래스에서 개인 구조를 정의 할 때 함수 매개 변수 또는 리턴 유형으로 어떻게 사용합니까?

분류에서Dev

클래스 내의 상수에 함수 경로 또는 더 깊은 값을 할당 할 수 있습니까?

분류에서Dev

C ++, 클래스 포인터 벡터에 std :: sort 사용-또는 함수 이름을 제대로 지정할 수 없습니다.

분류에서Dev

aspx.cs 파일에서 내 C # 클래스를 사용할 수없는 이유는 무엇입니까?

분류에서Dev

C ++의 클래스에서 연산자 오버로딩 함수를 어떻게 사용할 수 있습니까?

분류에서Dev

클래스 함수에서 클래스의 유형 힌트를 사용할 수 있습니까?

분류에서Dev

CreateThread-LPTHREAD_START_ROUTINE 유형 ThreadProc 콜백 함수를 C ++ 클래스 내에서 어떻게 구현할 수 있습니까?

분류에서Dev

익명 파생 클래스의 주소를 기본 클래스 포인터 C ++에 할당 할 수 있습니까?

분류에서Dev

Fortran 파생 형식 내부의 C 함수에 대한 포인터 보유

분류에서Dev

C ++ 다형성 : 이중 파생 클래스의 함수를 기본 클래스로 사용할 수 있습니까?

분류에서Dev

서로 다른 유형의 매개 변수를 사용하는 서로 다른 함수에 대한 포인터 쌍이 호환 될 수 있습니까?

분류에서Dev

템플릿 함수 또는 클래스 내부에 유형이 포함 된 컨테이너의 변수를 어떻게 인스턴스화합니까?

분류에서Dev

클래스 선언에서 클래스 유형의 포인터를 선언 할 수 있습니까?

분류에서Dev

TypeScript에서 생성자 함수를 다른 함수의 인수 유형으로 사용할 수 있습니까?

분류에서Dev

PHP의 클래스 내에서 filter_input (POST 또는 GET) 함수를 사용할 수있는 경우

분류에서Dev

typescript / angular로 내보내기 전에 클래스를 만들 수 있습니까? | TSLint : 사용되지 않은 식, 할당 또는 함수 호출이 필요합니다.

Related 관련 기사

  1. 1

    해당 클래스 C ++의 멤버 함수 내에서 클래스를 사용할 수 있습니까?

  2. 2

    C ++에서 함수의 반환 유형으로 포인터 또는 참조를 사용하는 것에 대한 경험 규칙이 있습니까?

  3. 3

    구조 유형 매개 변수를 사용하여 C ++ dll의 내 보낸 함수를 호출하는 powershell

  4. 4

    C ++에서 벡터 (또는 다른 유사한 데이터 유형)에 대한 사용자 반복 클래스를 작성할 수 있습니까?

  5. 5

    c 함수에서 내 보낸 환경 변수를 부모 셸에서 사용할 수 있는지 여부

  6. 6

    C ++에서 한 클래스의 포인터를 다른 클래스의 포인터로 캐스팅 할 수있는 이유는 무엇입니까?

  7. 7

    콜백으로 사용할 C ++에서 C # DLL 로의 관리되지 않는 내보내기를 사용하여 함수 포인터를 보내는 방법

  8. 8

    C ++의 다른 템플릿 함수에서 템플릿 클래스에 속하는 중첩 유형을 어떻게 사용할 수 있습니까?

  9. 9

    상주 .c 파일에서 액세스 할 수없는 불투명 포인터

  10. 10

    C ++ 14는 고유 포인터에서 상속 된 클래스의 복사 생성자 또는 operator =를 호출 할 수 없습니다.

  11. 11

    명령 줄 또는 bash 스크립트 파일을 통해 Talend에서 내 보낸 작업의 매개 변수를 어떻게 전달할 수 있습니까?

  12. 12

    python3 하위 프로세스에서 내 보낸 bash 함수를 사용할 수없는 이유는 무엇입니까?

  13. 13

    유형 또는 클래스에 대해 오버로드 된 operator <<가 있는지 확인할 수 있습니까?

  14. 14

    클래스에서 개인 구조를 정의 할 때 함수 매개 변수 또는 리턴 유형으로 어떻게 사용합니까?

  15. 15

    클래스 내의 상수에 함수 경로 또는 더 깊은 값을 할당 할 수 있습니까?

  16. 16

    C ++, 클래스 포인터 벡터에 std :: sort 사용-또는 함수 이름을 제대로 지정할 수 없습니다.

  17. 17

    aspx.cs 파일에서 내 C # 클래스를 사용할 수없는 이유는 무엇입니까?

  18. 18

    C ++의 클래스에서 연산자 오버로딩 함수를 어떻게 사용할 수 있습니까?

  19. 19

    클래스 함수에서 클래스의 유형 힌트를 사용할 수 있습니까?

  20. 20

    CreateThread-LPTHREAD_START_ROUTINE 유형 ThreadProc 콜백 함수를 C ++ 클래스 내에서 어떻게 구현할 수 있습니까?

  21. 21

    익명 파생 클래스의 주소를 기본 클래스 포인터 C ++에 할당 할 수 있습니까?

  22. 22

    Fortran 파생 형식 내부의 C 함수에 대한 포인터 보유

  23. 23

    C ++ 다형성 : 이중 파생 클래스의 함수를 기본 클래스로 사용할 수 있습니까?

  24. 24

    서로 다른 유형의 매개 변수를 사용하는 서로 다른 함수에 대한 포인터 쌍이 호환 될 수 있습니까?

  25. 25

    템플릿 함수 또는 클래스 내부에 유형이 포함 된 컨테이너의 변수를 어떻게 인스턴스화합니까?

  26. 26

    클래스 선언에서 클래스 유형의 포인터를 선언 할 수 있습니까?

  27. 27

    TypeScript에서 생성자 함수를 다른 함수의 인수 유형으로 사용할 수 있습니까?

  28. 28

    PHP의 클래스 내에서 filter_input (POST 또는 GET) 함수를 사용할 수있는 경우

  29. 29

    typescript / angular로 내보내기 전에 클래스를 만들 수 있습니까? | TSLint : 사용되지 않은 식, 할당 또는 함수 호출이 필요합니다.

뜨겁다태그

보관