Câu hỏi liên quan

0 Phiếu
4 Câu trả lời
0 Phiếu
0 Câu trả lời
0 Phiếu
4 Câu trả lời
0 Phiếu
0 Câu trả lời
0 Phiếu
4 Câu trả lời

Có hợp lý chập trong C preprocessor?


0 Phiếu
Đã hỏi 23/5/2016 bởi About_fact (640 điểm)
Docs & Spreadsheets gcc cho cpp giải thích về chỉ thị #if:
[...] và các hoạt động hợp lý (& & và ||). Sau hai tuân theo các quy tắc short-circuiting bình thường của tiêu chuẩn C.
những gì hiện có nghĩa là? Có là không có evaluation biểu hiện trong quá trình tiền xử lý, vậy làm thế nào nó có thể chập?

3 Câu trả lời

0 Phiếu
Đã trả lời 03/6/2016 bởi Rkg_5667 (290 điểm)
Những gì họ đang đề cập đến là &&|| sử dụng cho #if
#if defined (AAA) || defined (BBB)
nếu defined (AAA) được xác định sau đó defined (BBB) không bao giờ được đánh giá.
UPDATE do đó, chạy tính toán sẽ được ngắn hạn circuited. Ví dụ, nếu bạn xây dựng với -Wundef để cảnh báo về việc sử dụng undefined macro.
#if defined FOO && FOO > 1000
#endif
#if FOO > 1000
#endif
sẽ cho kết quả trong
thomas:~ jeffery$ gcc foo.c -Wundef
foo.c:4:5: warning: 'FOO' is not defined, evaluates to 0 [-Wundef]
#if FOO > 1000
    ^
1 warning generated.
vì vậy, phiên bản đầu tiên không tạo ra các undefined vĩ mô cảnh báo, bởi vì FOO > 1000 không được đánh giá.
OLD MUSINGS này trở nên quan trọng, nếu phần thứ hai là một vĩ mô có tác dụng phụ. Vĩ mô sẽ không được đánh giá, do đó, các tác dụng phụ nào không diễn ra.
để tránh lạm dụng vĩ mô tôi sẽ cung cấp cho một
#define FOO
#define IF_WARN(x) _Pragma (#x) 1
#if defined(FOO) || IF_WARN(GCC warning "FOO not defined")
#endif
ví dụ hơi sane bây giờ mà tôi xây dựng các ví dụ này, tôi bây giờ chạy vào một vấn đề. IF_WARN luôn luôn được đánh giá. huh, nhiều nghiên cứu cần thiết.
cũng foo... bây giờ mà tôi đọc nó một lần nữa.
macro. Tất cả các macro trong expression đang mở rộng trước khi bắt đầu thực tế tính toán của các biểu hiện value .
0 Phiếu
Đã trả lời 03/6/2016 bởi tb9033 (190 điểm)
có là không có evaluation biểu hiện trong quá trình tiền xử lý, vậy làm thế nào nó có thể chập?
Yeah đó là evaluation expression trong quá trình tiền xử lý .

C11: 6.10.1 điều kiện bao gồm (p4):

trước khi evaluation , macro invocations trong danh sách của tiền xử lý thẻ đó sẽ trở thành...
trong một chú thích 166:
kiểm soát expression liên tục được đánh giá trong quá trình dịch giai đoạn 4 , tất cả các định dạng...
các báo cáo rõ ràng làm chứng rằng có evaluation expression trong tiền xử lý . Điều kiện cần thiết là kiểm soát expression phải đánh giá một giá trị integer . Bây giờ operator &&|| sẽ tuân theo các quy tắc short-circuiting bình thường của tiêu chuẩn C như đã nêu trong GNU tài liệu . Bây giờ chạy này program và không có // và xem kết quả để xem các hành vi ngắn mạch:
#include<stdio.h>
#define macro1 1
//#define macro2 1
int main( void )
{
    #if  defined (macro1)  && defined (macro2)
    printf( "Hello!\\n" );
    #endif
    printf("World\\n"); 
    return 0;
}
0 Phiếu
Đã trả lời 03/6/2016 bởi Ers_eun (200 điểm)
Rất đơn giản: undefined macro có số value zero, và các bộ phận của zero là bất hợp pháp.
#if FIXEDSIZE && CHUNKSIZE/FIXEDSIZE > 42
#define USE_CELLPOOL
#endif

#if đánh giá các phần còn lại của dòng của nó như là một biểu hiện thường xuyên integer . Tài liệu được liên kết của bạn bắt đầu:
'#if' chỉ cho phép bạn test value một biểu thức số học, chứ không phải chỉ tồn tại của một vĩ mô.
không phải là một phần mở rộng gcc, các tiêu chuẩn syntax cho #if
#if constant-expression new-line group opt .
C99 preprocessor xử lý tất cả các hằng số là [u]intmax_t.
Đã bình luận 03/6/2016 bởi This_dikes (540 điểm)
Tôi nghĩ rằng ở đây, ngắn mạch có nghĩa là không đánh giá nhiệm kỳ thứ hai nếu evaluation số hạng đầu tiên là hoàn toàn xác định giá trị kết quả

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...