2010-03-10 3 views
9

C 파일의 특정 시점에서 GNU C 전 처리기, CPP (또는 다른 도구) 목록 사용할 수있는 모든 매크로와 그 값을 만들 수있는 방법이 있습니까? 이미 유닉스 정통한의 프로그램을 포팅 및 유닉스 시스템 파일의 스파 스 무리를로드하는 동안목록 C 상수/매크로

나는 시스템 특정 매크로를 찾고 있어요. 정의를 사냥가는 것보다 더 쉬운 방법이 있다면

그냥 궁금.

+3

흥미로운 질문입니다 ... 아마도 당신의 의도를 포함하면 더 나은 대답을 얻을 수 있을까요? – fbrereto

답변

15

나는 파일의 특정 지점에 대해 알고 있지만, 사용하지 않습니다

$ touch emptyfile 
$ cpp -dM emptyfile 

덤프 모든 기본 것들. 약간의 #include#define 행을 포함하는 C 파일에 대해 동일한 작업을 수행하면 모든 작업이 포함됩니다. 당신이 신경 쓰는 곳으로 파일을 잘라 버린 다음 똑같이 할 수있을 것 같아요? man page에서

:

-dCHARS
CHARS는 다음 문자 중 하나 이상의 순서이며, 공백 앞에해서는 안됩니다. 다른 문자들은 컴파일러가 해석하거나 GCC의 차기 버전을 위해 예약되어 있으므로 무시됩니다. 비헤이비어가 충돌하는 문자를 지정하면 결과가 정의되지 않습니다.

M
대신 일반 출력의, 사전 정의 된 매크로를 포함하여 cpp 수행 도중에 정의 된 모든 매크로에 대한 #define 지침의 목록을 생성합니다. 이렇게하면 전처리 기의 버전에서 미리 정의 된 것을 찾을 수 있습니다. foo.h 파일이 없다고 가정하면

touch foo.h; cpp -dM foo.h 

의 모든 매크로가 표시됩니다. 당신이 -E 옵션을 사용하지 않고 -dM을 사용하는 경우

, -dM-fdump-rtl-mach의 동의어로 해석됩니다. 두 점을 제외하면 M 추천

D
: 이것은 미리 정의 된 매크로를 포함하지 않으며, 그것은 #define 지시자 및 전처리 결과를 모두 출력한다. 두 종류의 출력 모두 표준 출력 파일로 이동합니다. D처럼

N

하지만에만 매크로 이름이 아니라 자신의 확장을 방출한다. 전처리의 결과에 더하여

I
출력 #include 지시자.

+1

그냥 호기심 - 'touch foo.h'명령이 필요한 이유는 무엇입니까? –

+0

@Michael, filename 인수가없는'cpp -dM'은'stdin'에 대한 데이터를 기다립니다. 그러면^D를 입력 할 수 있지만 빈 파일을 만드는 것이 더 쉽습니다. –

+0

감사합니다. '터치'는 빈 파일을 만드는 쉬운 방법이라는 것을 잊었습니다. –

0

Predefined-macros 섹션을 참조하지? 프로젝트 또는 그런 것을 만들기 위해 이걸 필요합니까?

+0

예 * 미리 정의 된 매크로 *는 gcc 매뉴얼의 좋은 섹션입니다. 그러나 이미 유닉스에 정통한 프로그램을 이식하고 희소 한 유닉스 시스템 파일을로드하는 동안 시스템 특정 매크로를 찾고 있습니다. 정의를 찾기 위해 사냥을하는 것보다 쉬운 방법이 있는지 궁금합니다. – ZJR

0

, 컴파일 할 때 특히, C 파일에 주어진 점을 보여줄 수 및 추적에 유용하다고 판단 될 것이라고이이 매크로를 사용하여 "는 C 파일의 특정 시점에서 그 값을"나열하려면 실패의 지점 ... foo.c를라는 파일이 샘플 코드 고려해 그 코드 로직이 파일에서 여러 번 사용 된 경우

 
if (!(ptr = malloc(20))){ 
    fprintf(stderr, "Whoops! Malloc Failed in %s at line %d\n", __FILE__, __LINE__); 
} 

을하고 malloc에 대한 호출이 실패했다, 당신은 것 이 출력을 얻으십시오 :

 
Whoops! Malloc Failed in foo.c at line 25 

줄 번호는 로직이 사용되는 소스의 위치에 따라 달라집니다. 이 샘플은 매크로를 사용할 수있는 위치를 보여주는 데 목적이 있습니다 ...

1

gcc를 사용하면 "-dD"옵션을 사용하여 모든 매크로 정의를 stdout으로 덤프 할 수 있습니다. 여기

0

명령 줄 옵션의 개요가있는 페이지에 link이 사전 정의 된 매크로 대부분의 컴파일러 (gcc, clang ...)에 대한를 나열하는 것입니다.

+0

... 대답은 항상 "-d"입니다.이 질문은 5 년 전 rtfm의 네크로맨서에 대한 답변이었습니다. 나는이 대답의 목적을 놓친다. – ZJR