2013-08-23 54 views
13

Tôi đã cố gắng một số tiền xử lý vụng về và đã đưa ra một cái gì đó như thế này:Preprocessor lỗi khi xác định =

#include <stdio.h> 

#define SIX =6 

int main(void) 
{ 
    int x=6; 
    int y=2; 

    if(x=SIX) 
    printf("X == 6\n"); 
    if(y=SIX) 
    printf("Y==6\n"); 

    return 0; 
} 

gcc mang lại cho tôi những lỗi:

test.c: In function ‘main’:
test.c:10:8: error: expected expression before ‘=’ token
test.c:12:8: error: expected expression before ‘=’ token

Tại sao vậy?

+2

Bản sao có thể có của [Macro thực tế tệ nhất/lạm dụng tiền xử lý tồi tệ nhất mà bạn từng gặp phải là gì?] (Http://stackoverflow.com/questions/652788/what-is-the-worst-real -world-macros-pre-processor-abuse-youve-ever-come-across) Chỉ đùa thôi, câu hỏi hay. –

+1

Chạy điều này thông qua bộ tiền xử lý, các phép thử chuyển thành 'if (x = = 6)'. Tôi không chắc tại sao không gian được chèn vào ... có lẽ ai đó biết một trong những đặc điểm kỹ thuật C tốt hơn nhiều so với tôi sẽ đi cùng ... – cdhowie

+4

Các giao dịch tiền xử lý trong thẻ, hợp lý với các khoảng trống tách các thẻ. Khi nó mã hóa 'if (x = SIX)', nó có 'if',' (',' x', '=' và 'SIX'. Khi macro mở rộng' SIX', nó có thêm mã thông báo '=' và '6'. Nhưng hai mã thông báo liền kề' = 'không giống như một mã thông báo' == '(và thực tế là cú pháp C không hợp lệ) - do đó lỗi biên dịch –

Trả lời

15

== là một mã thông báo duy nhất, không thể chia nhỏ một nửa. Bạn nên chạy gcc -E trên mã của bạn

Từ trang hướng dẫn GCC:

-E Stop after the preprocessing stage; do not run the compiler proper. The output is in the form of preprocessed source code, which is sent to the standard output.

Input files that don't require preprocessing are ignored.

Đối với mã của bạn gcc -E cho đầu ra sau đây

if(x= =6) 
    printf("X == 6\n"); 

    if(y= =6) 
    printf("Y==6\n"); 

Thứ hai = là những gì gây ra thông báo lỗi expected expression before ‘=’ token

5

Bộ tiền xử lý không hoạt động ở cấp độ ký tự, nó hoạt động ở t cấp độ. Vì vậy, khi nó thực hiện các thay thế, bạn sẽ có được một cái gì đó tương đương với:

if (x = = 6) 

chứ không phải là mong muốn của bạn:

if (x==6) 

Có một số ngoại lệ cụ thể này, như các nhà điều hành # stringification.

+1

Trường hợp trống giữa '=' và '6' đến từ đâu? – alk

+1

@alk Tôi chỉ sử dụng các khoảng trống để hiển thị các đường viền mã thông báo. Theo như ngữ pháp C có liên quan, không có sự khác biệt giữa' = 6 'và' = 6'. – Barmar

0

Bạn đang sử dụng chuỗi công cụ nào? Nếu bạn đang sử dụng GCC, bạn có thể thêm tùy chọn -save-temps và kiểm tra kết quả trung gian test.i để khắc phục sự cố của bạn.

Tôi nghi ngờ bạn có khoảng cách giữa x==6.

4
if(x=SIX) 

được phân tách như

if (x= =6). 

Vì vậy, bạn nhận được lỗi.