IT TIP

C ++에서 bool을 재정의하는 C 헤더를 모방 할 수 있습니까?

itqueen 2021. 1. 5. 20:49
반응형

C ++에서 bool을 재정의하는 C 헤더를 모방 할 수 있습니까?


저는 프로그램을 작성 중이며 C ++로 작성하는 것을 선호하지만 bool을 재정의하는 C 헤더를 포함해야합니다.

# define false 0
# define true  1
typedef int bool;

확실한 해결책은 다음과 같이 헤더를 편집하는 것입니다.

#ifndef __cplusplus
# define false 0
# define true  1
typedef int bool;
#endif

그러나 아아, 라이브러리는 읽기 전용이므로 할 수 없습니다.

이 typedef를 무시하도록 gcc에 지시 할 수있는 방법이 있습니까? 아니면 대부분의 함수를 C ++로 작성한 다음 둘에 대한 C 래퍼를 만들 수 있습니까? 아니면 그것을 빨아 들여서 C로 써야할까요?


해킹 할 수 있습니다!

도서관 fooLib은 그것을 bool정의 할 권한이있는 어떤 유형 사용하고 있다고 생각합니다 . 도서관에서는 bool식별자 일뿐입니다.

따라서 대신 다른 식별자를 사용하도록 강제 할 수 있습니다.

#define bool fooLib_bool
#include "fooLib.h"
#undef bool
#undef true
#undef false

이제 컴파일러는 다음과 같이 변형 된 잘못된 줄을 봅니다.

typedef int fooLib_bool;

fooLib_bool = intreal 대신 type 사용하는 인터페이스에 갇혀 bool있지만 코드가 실제로의 속성에 의존 할 수 int있고 라이브러리 바이너리가 그러한 가정을 포함하여 컴파일 되었을 수 있기 때문에 해결이 불가능합니다 .


문제가되는 코드를 헤더에 래핑 한 다음 필요하지 않은 것을 정의 해제 할 수 있다고 가정합니다.

Library_wrapper.h :

#define bool something_else // This will get you past the C++ compilation
#include "library.h"
#undef false
#undef true
#undef bool

main.cpp :

#include "Library_wrapper.h" 
#include "boost.h"

typedef와 관련하여 .. 컴파일러는 C ++에서 기본 유형을 재정의하려고하면 불평해야합니다. 유형을 재 선언하거나 (C ++에서 허용됨) 정의 (간단한 텍스트 대체) 할 수 있습니다.


안타깝게도 표준 C ++에서는이 파일을 사용할 수 없습니다.

§7.1.3 [dcl.typedef]

6 / 주어진 범위에서 typedef 지정자는 다른 유형을 참조하기 위해 해당 범위에서 선언 된 유형의 이름을 재정의하는 데 사용되어서는 안됩니다.

따라서 typedef ... bool;금지됩니다.

§17.6.4.3.1 [매크로 이름]

2 / 번역 단위는 키워드, 표 3에 나열된 식별자 또는 7.6에 설명 된 속성 토큰과 어휘 적으로 동일 하지 #define않거나 #undef이름이 동일 하지 않아야 합니다.

그리고 §2.12 [lex.key]에서 우리는 그것이 bool키워드 라는 것을 발견했습니다 .

따라서 #define bool ...문제가되는 파일을 포함하기 전에을 사용하여 컴파일러를 속이려는 시도 는 금지됩니다.


그렇다면 대안은 무엇입니까? 심!

자신의 C & C ++ 호환 헤더 뒤에서 문제가되는 라이브러리를 분리하십시오. 이 부분을 C로 컴파일합니다. 그런 다음 문제 나 트릭없이 C ++ 프로그램에 자신의 헤더를 포함 할 수 있습니다.

참고 : 예, 대부분의 컴파일러는을 허용 할 것입니다 #define bool ....하지만 여전히 표준에서 명시 적으로 금지되어 있습니다.


You may copy a bad header and use an edited copy. Tell to compiler the path it should prefer and...


You could compile the code which uses the header as C, then just link it together with your C++ object files. You probably use MSVC or GCC; both can compile code as either C++ or C, and will allow you to create compatible object files.

Whether that's a clean solution or unnecessary overkill really depends on the exact situation.

ReferenceURL : https://stackoverflow.com/questions/21966230/can-i-mimic-a-c-header-that-redefines-bool-in-c

반응형