는 C 파일의 특정 시점에서 GNU C 전 처리기, CPP (또는 다른 도구) 목록 사용할 수있는 모든 매크로와 그 값을 만들 수있는 방법이 있습니까? 이미 유닉스 정통한의 프로그램을 포팅 및 유닉스 시스템 파일의 스파 스 무리를로드하는 동안목록 C 상수/매크로
나는 시스템 특정 매크로를 찾고 있어요. 정의를 사냥가는 것보다 더 쉬운 방법이 있다면
그냥 궁금.는 C 파일의 특정 시점에서 GNU C 전 처리기, CPP (또는 다른 도구) 목록 사용할 수있는 모든 매크로와 그 값을 만들 수있는 방법이 있습니까? 이미 유닉스 정통한의 프로그램을 포팅 및 유닉스 시스템 파일의 스파 스 무리를로드하는 동안목록 C 상수/매크로
나는 시스템 특정 매크로를 찾고 있어요. 정의를 사냥가는 것보다 더 쉬운 방법이 있다면
그냥 궁금.나는 파일의 특정 지점에 대해 알고 있지만, 사용하지 않습니다
$ 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
지시자.
그냥 호기심 - 'touch foo.h'명령이 필요한 이유는 무엇입니까? –
@Michael, filename 인수가없는'cpp -dM'은'stdin'에 대한 데이터를 기다립니다. 그러면^D를 입력 할 수 있지만 빈 파일을 만드는 것이 더 쉽습니다. –
감사합니다. '터치'는 빈 파일을 만드는 쉬운 방법이라는 것을 잊었습니다. –
왜 Predefined-macros 섹션을 참조하지? 프로젝트 또는 그런 것을 만들기 위해 이걸 필요합니까?
예 * 미리 정의 된 매크로 *는 gcc 매뉴얼의 좋은 섹션입니다. 그러나 이미 유닉스에 정통한 프로그램을 이식하고 희소 한 유닉스 시스템 파일을로드하는 동안 시스템 특정 매크로를 찾고 있습니다. 정의를 찾기 위해 사냥을하는 것보다 쉬운 방법이 있는지 궁금합니다. – ZJR
, 컴파일 할 때 특히, 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
줄 번호는 로직이 사용되는 소스의 위치에 따라 달라집니다. 이 샘플은 매크로를 사용할 수있는 위치를 보여주는 데 목적이 있습니다 ...
gcc를 사용하면 "-dD"옵션을 사용하여 모든 매크로 정의를 stdout으로 덤프 할 수 있습니다. 여기
흥미로운 질문입니다 ... 아마도 당신의 의도를 포함하면 더 나은 대답을 얻을 수 있을까요? – fbrereto