2017-05-14 9 views
5

나는 cpp foo.cgcc -E foo.c이 같은 방법으로 소스 파일을 전처리 할 것이라고 생각했지만 동일한 파일에 대해 출력이 달라졌습니다.cpp와 gcc의 차이 -E

$ cat foo.c 
#define VARIABLE 3 
#define PASTER(x,y) x ## _ ## y 
#define EVALUATOR(x,y) PASTER(x,y) 
#define NAME(fun) EVALUATOR(fun, VARIABLE) 

extern void NAME(mine); 

결과 cpp을 위해 :

$ cpp foo.c 
# 1 "foo.c" 
# 1 "<built-in>" 1 
# 1 "<built-in>" 3 
# 329 "<built-in>" 3 
# 1 "<command line>" 1 
# 1 "<built-in>" 2 
# 1 "foo.c" 2 





extern void mine ## _ ## 3; 

$ 

결과 gcc -Eclang -E에 대한 :

$ gcc -E foo.c 
# 1 "foo.c" 
# 1 "<built-in>" 1 
# 1 "<built-in>" 3 
# 330 "<built-in>" 3 
# 1 "<command line>" 1 
# 1 "<built-in>" 2 
# 1 "foo.c" 2 





extern void mine_3; 
$ 

왜 그 출력은 다릅니 까, 어느 내가보고 싶을 때 하나를 사용해야합니까 전처리 된 소스? gcc -E-traditional-cpp을 제거 할 것

원래 코드는 here

+0

방금 ​​시도했습니다. 내 버전의'cpp'는'gcc -E'와 동일한 결과물을 만들어냅니다. gcc 출력과 동일합니다. – selbie

+2

나는'gcc -E foo.c'와 마찬가지로'cpp foo.c'와 같은 결과를 얻었습니다. 'cpp -v foo.c'의 결과를 질문에 붙여 넣을 수 있습니까? –

+1

만약'--traditional-cpp'를 cpp의 명령 행 매개 변수로 사용한다면, 나는 당신과 같은 출력을 얻습니다. 보이는 사람은 이미 그 사람을 가능성있는 대답으로 식별하는 것을 좋아합니다. – selbie

답변

2

둘 사이의 차이입니다. 옵션을 포함하면 cpp과 같은 결과가 나타납니다.

https://gcc.gnu.org/onlinedocs/cpp/Traditional-Mode.html

+0

실제로. gcc는'-no-traditional-cpp'가 없으므로이 옵션을 어떻게 제거 할 수 있습니까? – Bilow

+0

내 워크 스테이션에있는 것과 같은 일부'cpp' 프로그램은'-traditional-cpp'로 기본 설정되어 있지 않은 것처럼 보입니다. 그래서'cpp'를 호출 할 때 전통적인 모드를 끄고 싶다면 어떻게해야할까요? 내 버전은'-no-traditional-cpp' 또는'--no-traditional-cpp'를 사용하려고하면 불평합니다. 'gcc -E'를 호출하는 것이 트릭을 대신하기 때문에 이것은 저에게 학문적입니다. –

+0

@Bilow :'gcc'는 달리 지정하지 않는 한 일반적으로이를 제거합니다. –