programing

C와 C++ 컴파일 비호환성 - 유형 이름 지정 안 함

bestcode 2022. 8. 13. 12:14
반응형

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를 수정하여 헤더를 변경하지 않고 컴파일할 수 있도록 하는 방법이 있습니까?

teststructC++ 로 스코프를 정의합니다.인증 ID를 생성할 수 있습니다.teststruct::u64따라서 이름 검색에 대한 언어 규칙이 이를 설명하므로 클래스 및 유니언 구성원은 외부 범위에서 식별자를 숨길 수 있습니다.한번만u64 u64;도입되었습니다.u64글로벌을 참조할 수 없습니다.::u64, 멤버만.그리고 멤버는 타입이 아니에요.

주식회사union teststruct는 범위를 정의하지 않습니다.이 필드는 구성원 액세스에서만 사용할 수 있으므로 경합이 발생하지 않습니다.따라서 필드는 파일 범위 유형 식별자를 숨길 필요가 없습니다.

내가 아는 한, 당신이 그것을 쉽게 하기 위해 할 수 있는 일은 아무것도 없다.이 라이브러리(완전히 유효한 C 라이브러리)는 유효한 C++ 라이브러리가 아닙니다.사용한 경우와 다를 바 없음new또는try변수 이름으로 지정합니다.적응이 필요합니다.

C++에서 잘못된 헤더 파일을 가지고 계신 것 같아서 할 수 없습니다.#includeC++로 하다라이브러리 헤더 파일을 변경할 수 없는 경우(라이브러리 공급업체에 문의하는 등), 가장 간단한 방법은 라이브러리 주위에 얇은 C++ 호환 래퍼를 작성하는 것입니다.

를 C 헤더에 하려면 C++ C를 .Wrapper.h ★★★★★★★★★★★★★★★★★」Wrapper.c서 는, 「」입니다.hC++에 포함시킬 수 있습니다.header.h및 라이브러리 상호 작용에 필요한 모든 유형 및 기능을 제공합니다. ★★★★★★★★★★★★★★★★★★★★★★..c 됩니다.#include "header.h"모든 콜(및 타입간의 안전한 변환에 필요한 모든 것)을 실장합니다.C++로 하다

C++를 수 있습니다.header.h 헤더 파일에 .header.hpp그런 다음 동일한 방법으로 새 버전을 변환할 수 있습니다.

컴파일러 오류는 무엇을 어디에서 변경해야 하는지에 대한 모든 정보를 제공합니다.

header.h:11:9: error: ‘u64’ does not name a type
  1. .header.h;
  2. 탐색 위치 11:9;
  3. ★★::
  4. ''에 대해 반복합니다.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

반응형