Programing

Bool을 C++로 재정의하는 C 헤더를 흉내낼 수 있을까?

c10106 2022. 5. 18. 21:42
반응형

Bool을 C++로 재정의하는 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

하지만, 아아, 도서관은 읽기 전용이기 때문에 나는 읽을 수 없다.

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 = int진품대신bool, 그러나 코드는 사실 의 속성에 의존할 수 있기 때문에 그것은 작업하는 것이 불가능하다.int, 그리고 도서관 2진법은 그러한 가정으로 편집되었을 것이다.

위반 코드를 헤더로 묶은 다음 필요 없는 코드를 정의 해제할 수 있을 겁니다.

라이브러리_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"

typef에 대해..만약 당신이 C++에서 기본 타입을 재정의하려고 한다면 컴파일러는 불평을 해야 한다.형식은 C++에서 허용됨을 기준으로 다시 정리하거나 정의(단순 텍스트 대체)할 수 있다.

불행히도, 아니, 당신은 표준 C++에서 이 파일을 사용할 수 없다.

§7.1.3 [dcl.clif]

6/ 주어진 범위에서는 다른 형식을 참조하기 위해 해당 범위 내에서 선언된 모든 형식의 이름을 재정의하기 위해 타이핑된 정의 지정자를 사용해서는 안 된다.

그러므로,typedef ... bool;금지되어 있다.

§17.6.4.3.1 [1998.names]

2/ 번역 단위는 안 된다.#define또는#undef키워드와 어휘적으로 동일한 이름, 표 3에 나열된 식별자 또는 7.6에 설명된 속성-토큰에 대한 이름.

그리고 § 2.12[lex.key]에서 우리는 다음과 같은 것을 발견했다.bool키워드 입니다.

따라서 다음을 사용하여 컴파일러를 속이려 함#define bool ...위반 파일을 포함하기 전에.


그렇다면, 대안은 무엇인가?심!

자신의 C&C++ 호환 헤더 뒤에 있는 위반 라이브러리를 분리하고 이 파트를 C로 컴파일하십시오.그런 다음 문제나 트릭 없이 C++ 프로그램에 자신의 헤더를 포함시킬 수 있다.

참고: 예, 대부분의 컴파일러가 이를 수용함#define bool ...그러나 그것은 여전히 표준에 의해 명백하게 금지되어 있다.

당신은 나쁜 헤더를 복사하고 편집된 복사본을 사용할 수 있다.선호해야 할 경로를 컴파일러에게 알려주고...

헤더를 C로 사용하는 코드를 컴파일한 다음 C++ 오브젝트 파일과 함께 연결하면 된다.MSVC 또는 GCC를 사용하는 경우, 둘 다 코드를 C++ 또는 C로 컴파일할 수 있으며 호환 가능한 객체 파일을 만들 수 있다.

그것이 깨끗한 해결책인지, 불필요한 과잉 살상인지는 정확한 상황에 달려 있다.

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

반응형