gcc의 cpp
을 포함한 거의 모든 C 프리 프로세서는 입력이 유효한 C 코드라고 가정합니다. C (또는 C++ 또는 Objective-C) 규칙에 따라 입력을 토큰 화해야합니다. 입력을 토큰 (보다 정확하게는 사전 처리 토큰)으로 해결해야했기 때문입니다. 토큰 레벨 이상의 구성은 문제가되어서는 안됩니다.
cpp
또는 gcc -E
을 사용하여 C 소스 코드가 아닌 텍스트를 사전 처리 할 수 있지만 일부 입력 구성은 문제를 일으킬 수 있습니다. 코멘트에서 예를 촬영
: 나는 GCC는 기본적으로 링커 입력 파일로 .txt
파일을 취급하기 때문에, gcc -E - < foo.txt
보다는 gcc -E foo.txt
을 사용했다
$ cat foo.txt
#define ADDTHEM(x, y) ((x) + (y))
ADDTHEM(2, 3)
$ gcc -E - < foo.txt
# 1 "<stdin>"
# 1 "<command-line>"
# 1 "<stdin>"
((2) + (3))
참고.
그러나 유효한 C 전처리 토큰으로 구성하지 않습니다
foo.txt
에 일부 콘텐츠를 추가하는 경우, 당신이 가진 수있는 문제 :
$ cat foo.txt
#define ADDTHEM(x, y) ((x) + (y))
ADDTHEM(2, 3)
ADDTHEM('c, "s)
$ gcc -E - < foo.txt
# 1 "<stdin>"
# 1 "<command-line>"
# 1 "<stdin>"
((2) + (3))
<stdin>:3:9: warning: missing terminating ' character [enabled by default]
<stdin>:3:0: error: unterminated argument list invoking macro "ADDTHEM"
ADDTHEM
의 (a C 프리 프로세서에 에이다 소스 코드를 공급하기위한 시도는 이것으로 실행 한 에이다가 속성 구문 고립 아포스트로피에게 '
문자를 사용하기 때문에 문제의 종류.) 입력 언어가 유효 C 전처리 토큰하지 않은 물건을 사용하지 않는 경우
그래서 당신이 그것을 할 수 있습니다.
사전 처리 토큰에 대한 자세한 내용은 C 표준의 섹션 6.4, the N1570 draft을 참조하십시오.
C 프리 프로세서 만 C, C++ 및 목표 - C 소스 코드와 함께 사용하기위한 것입니다 : 나는 밝히는는 GNU cpp manual을 확인하기 전에
는 사실 위를 썼다. 과거에는 일반 텍스트 프로세서 인 으로 악용되었습니다. C의 어휘적인 규칙을 지키지 않는 입력에 질식합니다. 예를 들어, 아포스트로피는 문자 상수의 시작으로 해석되어 오류를 발생시킵니다. 또한 입력의 특성을 그대로 유지하여 C- 제품군 언어에 중요하지 않은 것에 의존 할 수 없습니다. Makefile이 사전 처리되면 모든 하드 탭 이 제거되고 Makefile이 작동하지 않습니다.
그래서주의, 조립하지 C. 다른 알골 틱 프로그래밍 언어 (등, 파스칼, 에이다) 종종 안전 자주있는 일 에 CPP를 이용하여 멀리 얻을 수 있다고 말했다 가졌어요. `-traditional-cpp ' 모드는 공백을 더 많이 유지하며 그렇지 않은 경우 더 허용됩니다. 많은 문제는 자국어 설명 대신 C 또는 C++ 스타일 설명 을 작성하고 매크로를 간단하게 유지함으로써 피할 수 있습니다.
당신이 쓰고있는 언어에 맞는 전처리기를 사용해야합니다. 최신 버전의 GNU 어셈블러에는 매크로 기능이 있습니다. 대부분의 고급 프로그래밍 언어에는 자체적으로 조건부 컴파일 및 포함 메커니즘이 있습니다. 다른 모든 시도가 실패하면 은 GNU M4와 같은 진정한 일반 텍스트 프로세서를 사용해보십시오.
(즉 설명서의 저자는 분명히 에이다의 속성 구문으로 문제를 놓쳤다.)의
중복 가능성을 [GCC의 전처리 (http://stackoverflow.com/questions/3917316/gcc-preprocessor) - C에 대해 이야기하지만 대부분 관련성이 없습니다. 원하는 소스 텍스트에'-E' 플래그를 사용하십시오. – Mat
나는'gcc -E TestIn.txt -o TestOut.txt'를 시도했고 메시지를 받았다 : 연결이 완료되지 않았기 때문에 링커 입력 파일이 사용되지 않았다. TestIn.txt의 내용은 다음과 같습니다. #define ADDTHEM (x, y) ((x) + (y)) Test = ADDTHEM (2,3);'. 'Test = ((2) + (3)) ;; –
GCC는 확장 기능을 기반으로 파일의 종류를 결정하는 재미있는 경험적 방법을 가지고 있으며 분명히'. txt'는 링커 지시자입니다. 그냥 C :'gcc -xc -E TestIn.txt'라고 말하십시오. – Mat