문제
다른 것을 변경하지 않고 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 사용). 이렇게하면 처리 된 코드로 원하는 모든 것을 수행 할 수 있습니다.