문제

다른 것을 변경하지 않고 Sourcecode의 #Define 명령문을 필터링하는 C 프리 프로세서를 원합니다.

왜요? 소스가 다른 클라이언트에게 전달되는 경우 소스에서 일부 클라이언트 특정 코드를 제거하는 데 사용해야합니다.

기존 솔루션을 아는 사람이 있습니까?

감사! 사이먼

도움이 되었습니까?

해결책

CPP 대신 AWK와 같은 것을 사용할 수 있습니까? 제거 할 코드를 둘러싼 코드에 플래그를 추가하십시오. 예를 들어:

(...)
//BEGIN_REMOVE_THIS_CODE

printf("secret code");

//END_REMOVE_THIS_CODE
(...)

그런 다음 AWK 스크립트를 작성 하여이 코드를 제거하십시오.

BEGIN { write=1;}
/^\/\/BEGIN_REMOVE_THIS_CODE/ { write=0; next;}
/^\/\/END_REMOVE_THIS_CODE/ { write=1; next;}
    {
    if(write==1) print $0;
    }

다른 팁

이것은 내가 요청한 것 같네요 정의 된 값을 기반으로 IFDEF 블록을 제거하는 C 프리 프로세서가 있습니까?. 내가 얻은 최고의 대답은 sunifdef, 또는 'Unifdef의 아들'은 과도하게 뒤틀린 조건부 코드에서 저에게 안정적으로 작동했습니다 (플랫폼 별 편집을 수행하는 방법에 대한 부적절한 이론을 가진 다양한 플랫폼에서 20 년 이상의 개발에서 누적 된 CRUD).

나는 당신이 이것에 대한 전처리자가 필요하다고 생각하지 않습니다. 중첩되지 않은 경우 #ifdef코드에서 모든 Regex 엔진은 그 사이에있는 모든 것을 제거 할 수 있습니다. #ifdef CLIENT 그리고 #endif (먼저 일치하지 않도록 비가비적 인 일치를 사용하십시오 #endif, 마지막이 아닙니다).

클라이언트 특정 코드를 별도의 디렉토리 또는 소스 컨트롤에서 체크 아웃 해야하는 다른 프로젝트의 일부에 배치합니다.

다른 함수를 자리에 놓을 수 있도록 튀어 나오거나 (적절한 용어를 잊어 버린) 함수 호출을 느슨하게 연결하십시오.

코드 필터링을 위해 추가 매크로 언어 레이어를 사용하는 것이 좋습니다. 파일. C 프리 프로세서 친화적 구문을 사용하여 어떤 클라이언트에 속하는 부품을 표현할 수 있습니다.

//%ifdef CLIENT_A
  code for client A
//%endif

//%ifdef CLIENT_B
  code for client B
//%endif

//%if "CLIENT_A" || "CLIENT_B"
  code for client A and B
//%endif

'//%'접두사를 사용하면 코드를 수정하지 않은 컴파일 할 수 있습니다. 당신은 실행할 수 있습니다 파일 클라이언트에게 코드를 제공하기 전에

GCC를 사용하는 경우 다음을 사용할 수 있습니다.

gcc <insert files here> -E

-E 옵션은 GCC에 소스를 전제로 처리하고 컴파일하지 말라고 지시합니다.

또는 GREP를 사용하여 특정 파일을 필터링하고 전처리기를 풀어 줄 수 있습니다.

grep -r '#define CLIENT_CODE' ./*.h 

당신은 또한 시도 할 수 있습니다 unifdef Sunifdef보다 다소 간단합니다.

내가 아는 한 ... 사전 처리기는 별도의 단계로 실행할 수 있습니다 (올바른 컴파일러 Optios 사용). 이렇게하면 처리 된 코드로 원하는 모든 것을 수행 할 수 있습니다.

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