2017-05-14 14 views
5

Tôi nghĩ rằng cả hai cpp foo.cgcc -E foo.c làm tiền xử lý tệp nguồn theo cùng một cách, nhưng tôi nhận được kết quả của chúng khác nhau cho cùng một tệp.Sự khác biệt giữa cpp và 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); 

Kết quả cho 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; 

$ 

Kết quả cho gcc -E và cho clang -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; 
$ 

Tại sao những kết quả đầu ra khác nhau, và cái nào tôi nên sử dụng khi tôi muốn xem nguồn tiền xử lý?

đang Original here

+0

Tôi vừa thử điều này. Phiên bản 'cpp' của tôi tạo ra đầu ra giống hệt như' gcc -E'. Giống như đầu ra 'gcc' của bạn. – selbie

+2

Tôi nhận được kết quả tương tự với 'cpp foo.c' như với' gcc -E foo.c'. Bạn có thể dán đầu ra của 'cpp -v foo.c' vào câu hỏi không? –

+1

Nếu tôi sử dụng '--traditional-cpp' như một tham số dòng lệnh để cpp, tôi nhận được kết quả tương tự như của bạn. Có vẻ như ai đó đã xác định đó là câu trả lời có khả năng. – selbie

Trả lời

2

Sự khác biệt giữa hai là gcc -E sẽ loại bỏ -traditional-cpp. Nếu bạn bao gồm tùy chọn thì bạn sẽ nhận được kết quả tương tự như cpp.

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

+0

Thật vậy. Làm cách nào để gcc quản lý để loại bỏ tùy chọn này vì không có '-no-traditional-cpp'? – Bilow

+0

Có vẻ như một số chương trình 'cpp' (giống như chương trình trên máy trạm của tôi) được xây dựng để không mặc định là' -traditional-cpp'. Vì vậy, nếu bạn muốn tắt chế độ truyền thống khi gọi 'cpp', bất kỳ ý tưởng làm thế nào để làm điều đó? Phiên bản của tôi phàn nàn nếu tôi cố gắng sử dụng '-no-traditional-cpp' hoặc' --no-traditional-cpp'. Đây chỉ là học thuật đối với tôi kể từ khi gọi 'gcc -E' thay vì làm thủ thuật. –

+0

@Bilow: 'gcc' thường loại trừ nó trừ khi được chỉ định khác. –

Các vấn đề liên quan