Eclipse CDT가 말하는 이유는 다음과 같습니다.'구문 오류'이지만 컴파일에는 문제가 없습니다.

StackOverflow https://stackoverflow.com/questions/802410

  •  03-07-2019
  •  | 
  •  

문제

나는 다음과 유사한 명령문이 포함된 몇 줄의 기존 C 코드를 작업 중입니다.

struct collect_conn *tc = (struct collect_conn *) 
     ((char *)c - offsetof(struct collect_conn, runicast_conn));

Collect_conn 구조체는 다음 라인을 따릅니다:

struct collect_conn {
  struct runicast_conn runicast_conn;
  struct announcement announcement;
  const struct collect_callbacks *cb;
  struct ctimer t;
  uint16_t rtmetric;
  uint8_t forwarding;
  uint8_t seqno;
};

Eclipse CDT를 사용하고 있는데 주황색 구불구불한 선이 있는 줄을 '구문 오류'로 표시합니다.나는 그것이 CDT 인덱서에 의해 그렇게 표시되었다고 생각합니다.그러나 컴파일(터미널에서 수동으로)에는 문제가 없습니다.

그러나 이는 라인의 요소가 인덱싱되지 않기 때문에 약간 불편합니다(따라서 호출 계층 트리가 항상 정확하지는 않거나 요소 강조 표시 등).

Ecipse는 왜 라인을 그대로 좋아하지 않나요?

도움이 되었습니까?

해결책

Eclipse CDT에는 코드를 분석하고 인덱스 구축을위한 자체 전처리/파서가 포함되어 있습니다. 그러나 빌드 CDT를 호출하면 GCC와 같은 시스템 컴파일러로 호출됩니다. CDT 파서가 수락 한 구문과 컴파일러가 수락 한 구문 사이에는 약간의 차이가있을 수 있습니다. 이런 일이 발생하면 CDT 파서가 혼란 스러울 수 있습니다.

내 시스템에서 offsetof 매크로는 __offsetof__ 예어. 이 키워드는 CDT에서 인식되지 않으므로 구문 오류가 발생합니다. 이 문제를 다루기 위해 CDT 파서에는 다루기위한 매크로가 있습니다. __offsetof__ 다음과 같이 보입니다.

#define __offsetof__(x) (x)

이것은 적어도 내 시스템에서 결과는 __offsetof__ 여전히 구문 오류로 이어지는 소스의 키워드.

경로와 기호 속성 페이지로 이동하여 매크로를 추가하여 구문 오류를 제거 할 수있었습니다. __offsetof__ 'foo'에지도. 이것은 파서가 이전에 보지 못했지만 구문 오류가 아닌 함수에 대한 호출을 생각하도록 속이는 속임수입니다.

또는 Window로 이동하여 편집기에서 구문 오류보고를 해제 할 수 있습니다.

다른 팁

선호도가있는 Eclipse CDT에서 문제를 해결했습니다.> C/C ++-> 언어 매핑 : 콘텐츠 추가 유형 : C-Header Language : C ++

CDT 파서는 부분 오프셋 (struct ...)을 좋아하지 않는 것 같습니다. typedef를 사용하여 collect_conn을 선언하면 오류가 사라집니다. 적어도 나에게는 다음 코드가 작동합니다.

typedef struct  {
   struct runicast_conn runicast_conn;
   struct announcement announcement;
   const struct collect_callbacks *cb;
   struct ctimer t;
   uint16_t rtmetric;
   uint8_t forwarding;
   uint8_t seqno;
} collect_conn;
...
struct collect_conn *tc = (struct collect_conn *)
     ((char *)c - offsetof(collect_conn, runicast_conn));

원래 선언을 변경할 수없는 경우 다음과 같은 작업을 수행합니다.

typedef struct collect_conn collect_conn_t;

혼란 스러울 수 있습니다. 정의가 있는지 확인하십시오. 오프셋 예를 들어 스코프 내. 그렇지 않으면 표현식을 단순화하고 EG A를 사용하여 헤어질 수 있습니다. #define 이랑 offset 또는 뭔가.

컴파일러가 내장 버전을 제공 할 수 있다고 생각합니다. offsetof, Eclipses의 컴파일러/코드 파서는 그렇지 않을 수 있습니다. 그렇다면, 당신은 정의가 있는지 확인해야합니다.

인덱서를 "full c/c ++ indexer (complete parse)"로 전환하십시오.

때로는 코드가 오류 없이 컴파일되더라도 Eclipse CDT의 실시간 코드 분석기가 C/C++ 파일에 일부 오류를 표시합니다(예:'함수 xxx를 확인할 수 없습니다.)이는 Eclipse CDT가 코드를 분석하고 인덱스를 구축하기 위해 MinGW(또는 다른 GNU 컴파일러) 대신 자체 전처리기/파서를 사용하기 때문입니다.작업공간의 모든 Eclipse 프로젝트에 대해 이 문제를 전역적으로 수정하려면 다음 단계를 따르세요.(특정 프로젝트에 대해서만 이 문제를 해결하려면 '메뉴'에서 1, 2, 4단계를 수행하세요.프로젝트->기본 설정')

1-인 메뉴 '창->기본 설정->C/C++->언어 매핑', 아래와 같이 올바른 매핑을 추가합니다.(예:콘텐츠 유형의 경우:C++ 소스/헤더 파일, GNU C++ 언어 사용 등)전역 언어 매핑 설정

2-인 메뉴'창->기본 설정->C/C++->인덱서', 아래와 같이 모든 확인란('건너뛰기' 확인란 제외)을 선택하여 전체 인덱싱을 설정합니다.글로벌 인덱서 설정

3-각 프로젝트의 특정 속성에서 메뉴 '프로젝트->속성->C/C++ 일반->인덱서', 아래와 같이 '프로젝트별 설정 활성화'를 선택 취소합니다.프로젝트 인덱서 설정

4-인덱싱 다시 작성, 메뉴 '프로젝트->C/C++ 인덱스->다시 빌드'.

IV도 같은 문제를 겪었습니다. 오프셋의 정의는 2 가지가 있습니다 (하나는 C 용 및 C ++ 용). IMO 문제는 그것에서 나옵니다

예를 들어 내가 입력하는 경우

#ifndef __cplusplus
#endif

일식은 그것을 회색으로 만들 것입니다. __cplusplus가 정의되었지만 내 프로젝트는 C입니다.

불행히도 나는 수정을 찾지 못한다.

새로운 CDT 프로젝트 마법사에서 Makefile Project에서 탭 오류 파서를 확인한 후에도 비슷한 문제를 해결 한 후 CDT Visual C Error Parser (GCC를 사용하고 있습니다).

나는 이런 문제를 해결하게되었다. 먼저 프로젝트 속성을 열고 C/C ++ 일반-> 경로 및 기호 범주를 열었습니다. 기호 탭 아래 에서이 항목을 추가했습니다.

Symbol: offsetof(TYPE,MEMBER)
Value: ((ssize_t) &((TYPE *)0)->MEMBER)

이 기호는 인덱서에 의해 사용되지만 컴파일러로 전달되지는 않습니다 (적어도 MakeFile 프로젝트에서는 다른 종류의 C 프로젝트에서 시도하지 않았습니다).

나는 일식이 때때로 이것을하는 것을 보았고, 나는 그것을 Java에 사용합니다. 일반적으로 파일을 닫고 다시 열면 나에게 파일이 수정됩니다 (잘못된 것이 무엇이든 재설정). 일반적으로 오류가 발생했지만 고정 된 오류 인 것 같습니다. "오류 캐시"는 올바르게 업데이트되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top