2011-03-22 4 views
-2

/* */#if 0 사이에 있고 대응하는 #endif 사이에있는 파일에서 모든 텍스트를 제거하는 좋은 방법은 무엇입니까? C 헤더에서이 부분을 제거하고 싶습니다. 이것은 내가 지금까지 가지고있는 코드 :C 헤더 파일에서 특정 사전 처리기 지시문과 주석을 자동으로 제거하는 방법은 무엇입니까?

For line in file: 

    if def0Encountered == 0: 
     if Line.strip().startswith('#if 0') == True: 
      Def0StartsAt = Line.find('#if 0') 
      def0Encountered = 1 
      if Line.find('#endif')!= -1: 
       def0Encountered = 0 
       Def0EndsAt = Line.find('endif') 
       Line = Line[0:Def0StartsAt] + Line[Def0EndsAt + 2 : ] 
       List = Line.split() 
+2

Markdowns로 질문을 다시 포맷하십시오. – bdhar

+2

CPP가'#if 0 ... #endif'를 모두 한 줄로 처리 할 수 ​​있습니까? – sarnold

답변

0

정규 표현식을 사용하여 원하지 않는 파일의 부분을 빈 문자열로 바꿀 수 있습니다 (참고 : this 매우 기본이므로 중첩 매크로의 경우에는 작동하지 않습니다.)

#!/usr/bin/env python 

import re 

# uncomment/comment for test with a real file ... 
# header = open('mycfile.c', 'r').read() 
header = """ 

#if 0 
    whatever(necessary) 
    and maybe more 

#endif 

/* 
* This is an original style comment 
* 
*/ 

int main (int argc, char const *argv[]) 
{ 
    /* code */ 
    return 0; 
} 

""" 

p_macro = re.compile("#if.*?#endif", re.DOTALL) 
p_comment = re.compile("/\*.*?\*/", re.DOTALL) 

# Example ... 
# print re.sub(p_macro, '', header) 
# print re.sub(p_comment, '', header) 
+0

@miku : 정규식 구문이 좋지 않지만 중첩 된 # if의 경우를 다루고 있습니까? –

+0

감사합니다 그래서 함께 헤더 = file.readlines 전체 C 파일에서 작동합니다 사용하는 경우? – praveen

+0

@Space : 아니, 중첩 된'# if'. 이를 위해서는 일반적인 문법/표현 이상의 것이 필요합니다. 그러나 좋은 점은, 나는 나의 지위에 메모를 추가 할 것이다. – miku

0

이 이상한 코드가 있는지 확인을하고해야하지 무엇을하지만, 파일 라인 별 반복하는 정직하고 있습니다. 두 개의 플래그를 사용하여 주석 안에 있는지 또는 블록인지 여부를 확인하십시오. 문자열 비교를 기반으로 플래그를 토글합니다. 두 플래그의 값에 따라 현재 행을 출력하거나 무시합니다.

관련 문제