2017-01-09 35 views
9

Xem sau Ví dụ:Tại sao "foo \ <NEWLINE> thanh" trở thành "foo bar" sau "gcc -E"?

$ cat foo.c 
int main() 
{ 
    char *p = "foo\\ 
bar"; 
    return 0; 
} 
$ gcc -E foo.c 
# 1 "foo.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "foo.c" 
int main() 
{ 
    char *p = "foo\bar"; 

    return 0; 
} 
$ 

Từ sự hiểu biết của tôi 2 \ được thoát bởi 1 \ nên 2 \ không nên được kết hợp với <NEWLINE> sau để tạo thành tiếp tục dòng.

+0

Nếu bạn muốn một dòng mới trong chuỗi c, bạn phải chèn nó một cách rõ ràng bằng cách sử dụng ''\ n''. – LPs

+0

Xem http://stackoverflow.com/questions/12694838/defining-a-string-over-multiple-lines – pringi

Trả lời

18

Các quy tắc khá rõ ràng trong ISO/IEC 9899: 2011 §5.1.1.2 giai đoạn dịch:

  1. Mỗi thể hiện của một nhân vật dấu chéo ngược (\) ngay lập tức theo sau là một ký tự dòng mới bị xóa, nối các dòng nguồn vật lý để tạo thành các dòng nguồn logic. Chỉ có dấu gạch chéo ngược cuối cùng trên bất kỳ dòng nguồn vật lý nào đủ điều kiện để là một phần của mối nối đó.

Ký tự trước dấu gạch chéo ngược cuối cùng không được tham khảo. Giai đoạn 1 chuyển đổi các dấu phẩy thành các ký tự thông thường. Điều đó quan trọng vì ??/ là dấu vết cho \.

16

Bộ tiền xử lý loại bỏ tất cả các lần xuất hiện của dấu gạch chéo ngược-dòng mới trước khi cố gắng mã hóa đầu vào; không có cơ chế thoát cho điều này. Nó không giới hạn đối với chuỗi ký tự:

#inclu\ 
de <st\ 
dio.h> 

int m\ 
ain(void) { 
    /\ 
* yes, this is a comment */ 
    put\ 
s("Hello,\ 
world!"); 
    return 0; 
} 

Đây là mã hợp lệ.

Sử dụng \\ để nhận một đơn \ chỉ áp dụng cho chuỗi ký tự và ký tự và xảy ra sau này trong quá trình xử lý.

+0

Có thể cần lưu ý rằng có bước này trước tất cả những người khác làm cho nó có thể dịch máy móc mã có chứa các dòng dài để sử dụng trên các hệ thống có độ dài dòng tối đa sẽ quá ngắn để không thể chứa nó, mà không cần tiện ích dịch phải kiểm tra bất kỳ thứ gì trong tệp nguồn ngoài vị trí của dòng mới (mặc dù khi dịch một tệp từ hệ thống sử dụng bản ghi có độ dài cố định một hệ thống có độ dài bản ghi ngắn hơn, mã sẽ cần phải đảm bảo rằng nó chỉ thêm dòng mới trong trường hợp nội dung của dòng gốc vượt quá mức tối đa mới). – supercat

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