2010-04-11 32 views
13

Có cách nào để chạy bộ xử lý trước GCC, nhưng chỉ cho các macro do người dùng xác định?Chạy bộ xử lý trước "ánh sáng" cho GCC

Tôi có một vài lớp lót và một số #ifdef, v.v. có điều kiện và tôi muốn xem mã của tôi trông như thế nào khi chỉ những mã được mở rộng.

Vì nó là, bao gồm được mở rộng, fprintf(stderr) s đến lượt tôi vào fprintf(((__getreeent())->_stderr) vv

Trả lời

14

Gọi cpp trực tiếp, ví dụ

$ cat >foo.c <<EOF 
#define FOO 
#ifdef FOO 
foo is defined 
#else 
foo is not defined 
#endif 
EOF 

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


foo is defined 

Tất nhiên, nếu bạn bao gồm bất kỳ tiêu đề nào thì các tiêu đề đó sẽ được đưa vào đầu ra. Một cách để tránh điều đó có thể chỉ là grep -v ra khỏi các đường với #include s (hoặc có lẽ chỉ với #include < và cho phép #include "). Hoặc bạn có thể chỉ định tùy chọn -nostdinc để loại bỏ chỉ tiêu chuẩn bao gồm (nhưng có thể để lại trong thư viện địa phương trừ khi bạn chỉ định đường dẫn để chúng không được tìm thấy) - điều này sẽ cảnh báo về tiêu đề bị thiếu.

Chỉnh sửa: Hoặc sử dụng chính bộ tiền xử lý để làm cho việc bao gồm các tiêu đề có điều kiện, quấn chúng vào một cái gì đó như #ifndef TESTING_PREPROCESSOR và sử dụng -DTESTING_PREPROCESSOR.

+2

1 - Những mẹo để đưa 'cái dòng include' # trong một '# if' phần là một trong những điều đơn giản nhưng hiệu quả có thể không xảy ra với ai đó cho đến khi một loạt các nỗ lực khác bị lãng phí khi thử những thứ phức tạp hơn. –

3
cpp -nostdinc program.c 
1
gcc -E inputfile.c > outputfile.c 

outputfile.c sẽ có mã xử lý trước bạn, nhưng tất cả các macro sẽ được mở rộng.

Tôi thấy mẹo này rất hữu ích khi gỡ lỗi biên dịch các hệ thống lớn với tấn bao gồm, cờ trình biên dịch và các biến makefile. Nó sẽ lộ bao gồm các tập tin mà không có bảo vệ tiêu đề, và một loạt các vấn đề khác quá.

+1

Đó không phải là cách chuẩn để chạy bộ tiền xử lý? Làm thế nào để trả lời câu hỏi này? Có lẽ OP muốn một hành vi không chuẩn (?). –

+0

Đây là cách tiêu chuẩn. Nếu chương trình của bạn nặng trên các macro do người dùng xác định và ánh sáng trên các macro không do người dùng xác định thì các macro do người dùng xác định sẽ dễ dàng phát hiện. bằng cách chạy một diff của inputfile.c và outputfile.c. Trong nhiều trường hợp, gcc -E là đủ tốt, mặc dù chắc chắn hoàn hảo trong việc phát hiện các macro "chỉ" do người dùng xác định. Và nó nhanh hơn rất nhiều so với sử dụng các phương pháp hoàn hảo được mô tả trong các câu trả lời khác. –

2

Người ta có thể sử dụng các công cụ như unifdef, unifdefall - loại bỏ điều kiện tiền xử lý từ mã

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