2016-07-14 6 views
0

내가 번역 파일을 말해봐 FEATURE이 정의에 TARGET는 정의보관할 전처리 출력에 문을 포함

// File options.h 
#ifdef TARGET_A 
#define FEATURE_X 
#endif 
#ifdef TARGET_B 
#define FEATURE_Y 
#endif 
struct foo { 
    int a; 
    int b; 
}; 

을 내가 FEATUREifdef '에드는 정의 파일의 무리가 있습니다

// File foo.c 
#include "options.h" 
#ifdef FEATURE_X 
int x; 
#endif 
#ifdef FEATURE_Y 
int y; 
#endif 

그렇다면 어떻게하면 foo.c을 사전 처리하여 include 문을 처리하지만 파일에 보관할 수 있습니까? 같은

뭔가 :

$ some-pre-process-tool -DTARGET_A -I. -o foo.pp.c foo.c 
$ cat foo.pp.c 
// File foo.c 
#include "options.h" 
int x; 
$ 
+0

당신이 할 수있는 아마도 (coan) (http://coan2.sourceforge.net/)을 사용하여 (아마도 쉽게는 아니지만) 필요한 것을 얻을 수있을 것입니다. 행운을 빕니다. – rici

+0

해결책을 찾기 위해 인터넷 검색을 할 때 그걸 보았습니다. 그러나이 목적을 위해서는 너무 큰 노력처럼 보였습니다. 당신은 이것을 사용하고/알고 있습니까? 그리고 이런 종류의 것들에 좋은가요? 내가 궁금해하는 임의의 공백을 제거하는 해결책으로 인해 묻고있다. – Allan

+0

나는 coan을 사용했고 해결하기 위해 착수 한 문제를 해결했다. 나는 당신의 문제를 해결하는 것이 얼마나 쉬운 지 모르겠다. 나는 두 단계가 필요하다고 생각한다. 먼저 두 가지 단계가 필요하다. 대상 선택에서 어떤 결과가 나오는지 먼저 확인한다. 관련 기능 매크로를 이름으로 식별하는 방법) coan을 사용하여 해당 매크로 만 선택적으로 처리 할 수 ​​있습니다. – rici

답변

-1

나는 사전 처리 된 파일은 문자 또는 문자열 리터럴 내부 및 보조 라인 기록의 시작 부분에 #을 포함 할 수 두려워.

2

우선, 왜 사전 처리 된 코드에 #include을 보관하고 싶습니까? 전처리기를 통해 다시 실행할 계획입니까, 아니면 결과를 읽을 때 도움이됩니까?

gcc 플래그 -Wp,-dI으로 원하는 것을 얻을 수 있습니다. -dI 여기에 설명되어 있습니다 : 출력 파일도 S '의 당신이 포함 된 파일의 모든 자녀 #include 내부에서의'의 #include있을 것이라는 점을 https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#index-dI-1113

참고.

+0

오케이 좋았어, 충분하지 않았어 ... 출력물에 포함 된 파일의 내용을보고 싶지 않아. 이를 반영하기 위해 예제를 업데이트했습니다. 참고 자료 : 다양한 변형으로 컴파일 된 일부 코드를 이해하려고하기 때문에이를 원합니다. 차이점을보고 싶습니다. – Allan

+0

당신은 내용을보고 싶지 않지만 포함 된 파일에서'# define'을 여전히 사용하기를 원합니까? –

+0

아니, 나는 정의를 보는 것에 관심이 없다. 나는 정의를 평가하는 전처리기에 관심이있다. – Allan

0

가이 일을 제대로 더 나은 방법이 있습니다 -하지만 난 이런 식으로 호출 할 수 있습니다 cpp

#!/usr/bin/env ruby 
# File: pp.rb 

f = open("| cpp -C -dI #{ARGV.join(" ")}") 

# First line 
f.gets =~ /"([^"]+)"/ 
file = $1 
ll = [] 

# Skip "invisible" includes 
while l = f.gets 
    if l =~ /^#\s*1\s*"#{file}"$/ 
     ll = [] 
    else 
     ll.push l 
    end 
end 

inc = false 
skip = false 
skip_line = nil 
ll.each do |l| 
    if inc and l =~ /^#\s*(\d+)\s*"#{file}"$/ 
     inc = false 
     skip = true 
     skip_line = $1.to_i 
    elsif skip and l =~ /^#\s*(\d+)\s*"#{file}"/ 
     inc = false 
     if $1.to_i == skip_line + 1 
      skip = false 
     end 
    elsif skip 
     inc = false 
    elsif l =~ /\s*#\s*include/ 
     puts l 
     inc = true 
    elsif l =~ /^#\s*(\d+)\s*"#{file}"/ 
    else 
     inc = false 
     puts l 
    end 
end 

의 출력을 처리하는 작은 래퍼 스크립트를 작성 결국 :

$ ./pp.rb -DTARGET_A -I. foo.c > foo.pp.c 
$ cat foo.pp.c 
// File foo.c 
#include "options.h" 

int x;