Visual Studio에서 사전 처리 후 C / C ++ 소스 파일을 보려면 어떻게합니까?


206

전 처리기 지시문이 많은 소스 파일이 있다고 가정 해 봅시다. 전처리 기가 완료된 후 어떻게 보이는지 확인할 수 있습니까?


사용중인 컴파일러와 같은 추가 정보를 제공하면 도움이됩니다.
JaredPar

현재 Visual Studio 2005를 IDE로 사용하고 있습니다.
Geo

그런 다음 기본적으로 cl.exe 컴파일러를 사용합니다.
Martin York

3
VS2005를 사용한다고 말했을 때 왜 gcc 답변이 수락 되었습니까?
Jim Buck

답변:


147

cl.exeMicrosoft Visual C ++에 대한 명령 행 인터페이스 인에는 사전 처리 된 파일을 출력하기위한 세 가지 옵션이 있으므로 Visual C ++에 대한 이전 응답의 불일치가 있습니다.

#line 지시문없이 파일을 사전 처리하려면 /P/EP옵션을 결합하십시오 .


1
nmake 및 Makefile을 사용하여 이러한 명령을 프로젝트에 어떻게 전달합니까?
WooDzu

@WooDzu NMAKE (nmake.exe)를 사용하여 기존 makefile을 사용하여 Visual C ++ 프로젝트를 빌드하는 작업을 자동화합니다. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky

8
참고 /POBJ 파일의 생성을 억제하는 것이다. 따라서 /P옵션 을 넣으면 실제로 생성되지 않기 때문에 일부 obj 파일을 찾을 수 없다는 링크 오류가 발생할 수 있습니다.
smwikipedia

MS 컴파일러 ( ) 를 사용하려고 할 때 사용 VS Developer command prompt하고 있는지 확인하십시오 . 컴파일러는 일반적인 comand 프롬프트에서 사용할 수 없습니다. Command promptcl
dmytro.poliarush

VS2019 커뮤니티 : / P LNK 1104 오류는 여전히 언론에서 뜨겁습니다.
Laurie Stearn

119

대부분의 컴파일러에는 전처리기를 실행할 수있는 옵션이 있습니다. 예를 들어 gcc는 -E를 제공합니다.

   -E  Stop after the preprocessing stage; do not run the compiler proper.  
       The output is in the form of preprocessed source code, which is sent
       to the standard output.

따라서 다음을 실행할 수 있습니다.

gcc -E foo.c

이러한 옵션을 찾을 수 없으면 컴퓨터에서 C 전처리기를 찾을 수도 있습니다. 일반적으로 cpp라고하며 이미 경로에 있습니다. 다음과 같이 호출하십시오.

cpp foo.c

다른 디렉토리에서 포함해야하는 헤더가있는 경우 일반 컴파일에서와 같이 -I / path / to / include / dir을 이들 중 하나에 전달할 수 있습니다.

Windows의 경우 전문가가 아니기 때문에 다른 포스터에 남겨두고 답변을 제공하겠습니다.



100

솔루션 탐색기에서 파일을 마우스 오른쪽 버튼으로 클릭하고 속성으로 이동하십시오. 구성 특성-> C / C ++-> 전 처리기에서 "전처리 된 파일 생성"이 찾고 있습니다. 그런 다음 솔루션 탐색기에서 파일을 마우스 오른쪽 버튼으로 클릭하고 "컴파일"을 선택하십시오. 사전 처리 된 파일은 출력 디렉토리 (예 : Release, Debug)에서 확장자가 .i 인 주석으로 작성됩니다 (의견이있는 Steed 덕분에).


9
VS2010의 "파일 전처리"
Rob W

18
BTW, 파일은 출력 디렉토리 (예를 들면 만들어집니다 Release, Debug확장자) .i.
Steed

1
이것은 프로젝트에 이미 설정된 빌드 구성을 사용하여 올바른 헤더를 모두 찾기 때문에 많은 도움이됩니다.
IanH

MSVC 2015에서 .i 파일은 출력 디렉토리 가 아니라 프로젝트의 중간 디렉토리에 있습니다. 예를 들어 CMake를 사용하여 프로젝트를 생성하는 경우에는 동일하지 않습니다.
user1556435

19

일반적으로 전 처리기의 출력에 대해 약간의 후 처리를 수행해야합니다. 그렇지 않으면 모든 매크로가 하나의 라이너로 확장되므로 읽기 및 디버깅이 어렵습니다. C 코드의 경우 다음과 같은 것으로 충분합니다.

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c

C ++ 코드의 경우 실제로 훨씬 더 어렵습니다. GCC / g ++의 경우이 Perl 스크립트가 유용하다는 것을 알았습니다 .


8

Microsoft 컴파일러에 대해서는 아무것도 모르지만 GCC에서는 다음을 사용할 수 있습니다.

gcc -E -P -o result.c my_file.h

주석을 보려면 다음을 사용하십시오.

gcc -E -C -P -o result.c my_file.h

이 페이지 에서 더 많은 옵션을 사용할 수 있습니다 .


1
또한 qcc.exe와 같은 gcc 파생 컴파일러에서도 작동합니다. 감사합니다!
현인

8

cl /EPMicrosoft의 C ++ 컴파일러를 사용중인 경우 사용해보십시오 .



5

bk1e와 Andreas M.이 대답했듯이 컴파일러의 / P 옵션은 파일을 전처리하도록합니다. 그러나 VS2005 및 Platform Builder (내장 ARM 프로세서 용)를 사용하는 프로젝트에서 프로젝트는 대화 상자 (Jim B에서 설명한대로)에 해당 옵션을 활성화하는 옵션을 표시하지 않았습니다.

CL을 수동으로 실행하고 / P를 추가 할 수 있었지만 전체 빌드 중에 Platform Builder에서 보이지 않게 활성화 된 적절한 명령 줄 옵션을 모두 알지 못했기 때문에 실패했습니다. 그래서 모든 옵션을 알아야했습니다.

내 해결책은 build.log 파일을보고 실행 한 줄을 찾는 것이 었습니다.

CL blah-blah-blah myfile.c

이 줄을 클립 보드에 복사했습니다. "blah-blah-blah"부분에는 빌드 옵션이 포함되어 있으며 엄청났습니다.

IDE로 돌아가서 myfile.c를 마우스 오른쪽 버튼으로 클릭하고 "빌드 창 열기"를 선택한 다음 해당 창에서 빌드 명령 행을 붙여넣고 "/ P"를 추가했습니다.

CL /P blah-blah-blah myfile.c

끝난. 전 처리기 출력을 포함하는 myfile.i 파일이 생성되었습니다.


2

CPIP 는 Python으로 작성된 새로운 C / C ++ 전 처리기입니다. 사전 처리 된 파일의 자세한 시각적 표현을 원하면 샷을 제공하십시오.

CPIP는 Python으로 구현 된 C / C ++ 전 처리기입니다. 대부분의 전처리 기는 전처리를 가능한 빨리 완료해야하는 더러운 작업으로 간주합니다. 이것은 전처리 단계에서 미묘한 결함을 추적하기가 매우 어려워 질 수 있습니다.

전처리 과정을 실제로 이해하는 개발자는 거의 없으며, 많은 사람들에게 이것은 불분명 한 흑 마법입니다. CPIP는이를 개선하고 사전 처리의 모든 세부 사항을 기록함으로써 CPIP가 파일 종속성, 매크로 사용 등에 관한 훌륭한 시각적 정보를 생성 할 수 있도록합니다.

CPIP는 cpp (또는 다른 기존의 전 처리기)를 대체하도록 설계되지 않았으며 대신 CPIP는 명확성 및 이해를 처리 속도보다 중요한 것으로 간주합니다.


2

Windows OS에서이 질문에 대한 간단한 한 줄 답변은 DOS 프롬프트에서 아래 명령을 사용하여 사전 처리 된 파일을 보는 것입니다.

CL /P /C myprogram.c

myprogram.i 라는 파일이 생성됩니다 . 그것을 열고 확장 된 전처리기를 찾으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.