C와 C++ 컴파일 비호환성 - 유형 이름 지정 안 함
공급업체의 라이브러리를 C++ 어플리케이션과 조합하여 사용하려고 합니다.라이브러리는 주로 C에 기반을 두고 있으며, 이는 일반적으로 C에 문제가 되지 않습니다.extern "C"
C++ 컴파일러가 받아들이지 않는 문제가 발생했습니다.
코드를 다음의 샘플 파일로 간략화했습니다.header.h는 서플라이어 라이브러리의 헤더를 나타내고 main.c/cpp는 나만의 파일입니다.저의 진짜 어플리케이션은 C++ 어플리케이션이기 때문에 main.cpp에서 동작시키고 싶습니다.
header.h (행 참조)u64 u64;
):
#ifndef HEADER_H
#define HEADER_H
#include <stdint.h>
typedef uint64_t u64;
union teststruct {
u64 u64;
struct {
u64 x:32;
u64 y:32;
} s;
};
#endif
main.c:
#include <stdio.h>
#include "header.h"
int main() {
union teststruct a;
a.u64=5;
printf("%x\n", a.u64);
return 0;
}
main.cpp(main.c와 동일하나 추가 포함)extern "C"
스테이트먼트):
#include <stdio.h>
extern "C" {
#include "header.h"
}
int main() {
union teststruct a;
a.u64=5;
printf("%x\n", a.u64);
return 0;
}
행을 사용한 main.c 컴파일
gcc -o test main.c
문제없이 컴파일 할 수 있습니다.단, 명령어를 사용하여 g++ 컴파일러를 사용하여 C++ 버전을 컴파일합니다.
g++ -o test main.cpp
에, 다음의 컴파일러 에러가 표시됩니다.
In file included from main.cpp:12:0:
header.h:11:9: error: ‘u64’ does not name a type
u64 x:32;
^
header.h:12:9: error: ‘u64’ does not name a type
u64 y:32;
^
문제는 공급업체가 유형과 변수 이름에 동일한 이름(u64)을 사용했기 때문에 처음에는 좋지 않은 생각 같지만 gcc는 이를 받아들인 것 같습니다.라이브러리(header.h)는 매우 크기 때문에 변경하고 싶지 않습니다.이것은 코드에서 많이 발생하고, 때때로 업데이트도 받습니다.g++가 이 조합을 받아들이도록 하는 방법이나 main.cpp를 수정하여 헤더를 변경하지 않고 컴파일할 수 있도록 하는 방법이 있습니까?
teststruct
C++ 로 스코프를 정의합니다.인증 ID를 생성할 수 있습니다.teststruct::u64
따라서 이름 검색에 대한 언어 규칙이 이를 설명하므로 클래스 및 유니언 구성원은 외부 범위에서 식별자를 숨길 수 있습니다.한번만u64 u64;
도입되었습니다.u64
글로벌을 참조할 수 없습니다.::u64
, 멤버만.그리고 멤버는 타입이 아니에요.
주식회사union teststruct
는 범위를 정의하지 않습니다.이 필드는 구성원 액세스에서만 사용할 수 있으므로 경합이 발생하지 않습니다.따라서 필드는 파일 범위 유형 식별자를 숨길 필요가 없습니다.
내가 아는 한, 당신이 그것을 쉽게 하기 위해 할 수 있는 일은 아무것도 없다.이 라이브러리(완전히 유효한 C 라이브러리)는 유효한 C++ 라이브러리가 아닙니다.사용한 경우와 다를 바 없음new
또는try
변수 이름으로 지정합니다.적응이 필요합니다.
C++에서 잘못된 헤더 파일을 가지고 계신 것 같아서 할 수 없습니다.#include
C++로 하다라이브러리 헤더 파일을 변경할 수 없는 경우(라이브러리 공급업체에 문의하는 등), 가장 간단한 방법은 라이브러리 주위에 얇은 C++ 호환 래퍼를 작성하는 것입니다.
를 C 헤더에 하려면 C++ C를 .Wrapper.h
★★★★★★★★★★★★★★★★★」Wrapper.c
서 는, 「」입니다.h
C++에 포함시킬 수 있습니다.header.h
및 라이브러리 상호 작용에 필요한 모든 유형 및 기능을 제공합니다. ★★★★★★★★★★★★★★★★★★★★★★..c
됩니다.#include "header.h"
모든 콜(및 타입간의 안전한 변환에 필요한 모든 것)을 실장합니다.C++로 하다
C++를 수 있습니다.header.h
헤더 파일에 .header.hpp
그런 다음 동일한 방법으로 새 버전을 변환할 수 있습니다.
컴파일러 오류는 무엇을 어디에서 변경해야 하는지에 대한 모든 정보를 제공합니다.
header.h:11:9: error: ‘u64’ does not name a type
- .
header.h
; - 탐색 위치 11:9;
- ★★
::
- ''에 대해 반복합니다.
does not name a type
문자열 처리만 하면 끝입니다.
PS: C-to-C++ 변환기에서도 가능합니다.
언급URL : https://stackoverflow.com/questions/51061148/c-vs-c-compilation-incompatibility-does-not-name-a-type
'programing' 카테고리의 다른 글
Enum 값을 문자열 리터럴로 사용 (0) | 2022.08.13 |
---|---|
해시맵의 get/put 복잡성 (0) | 2022.08.13 |
strdup 또는 _strdup? (0) | 2022.08.13 |
Vue Router 2는 해시 대신 해시방을 사용합니다. (0) | 2022.08.13 |
하위 Vue 프로젝트를 상위 Vue 프로젝트에 포함시키고 상위 Vue 스토어에 액세스합니다. (0) | 2022.08.13 |