2015-07-31 15 views
10

Tại sao điều này không thể biên dịch?Sử dụng macro có chuỗi bị lỗi trên VC 2015

char programDate[] = "("__DATE__")"; 

Nhưng điều này biên dịch tốt (xem gian):

char programDate[] = "(" __DATE__")"; 

tôi biết VC2015 bây giờ hỗ trợ đen-nhà khai thác. Nhưng không nên có trong giai đoạn biên dịch? __DATE__ nên được xử lý bởi bộ xử lý trước. Chuyện gì đang xảy ra ở đây?

Tôi đã nghĩ về một số vấn đề kết hợp với tính năng tạo Unicode/không phải Unicode - nhưng nó không có tác dụng. Nó không chỉ phát hành với các macro được xác định trước, nhưng với người dùng định nghĩa thêm:

#define MACRO "abc" 
char data[] = "("MACRO")"; 

EDIT:

Error C3688 invalid literal suffix '__DATE__'; literal operator or literal operator template 'operator ""__DATE__' not found 
+0

Tôi nghĩ bạn có thể đang nói về điều gì đó trong nhận xét của bạn về các chữ được người dùng xác định. Nói chung, các trình phân tích cú pháp C++ là ** munch tối đa **, đối với mỗi mã thông báo, chúng chiếm nhiều ký tự nhất có thể cho đến khi nó không còn là mã thông báo hợp lệ nữa. –

+0

Bạn có thể viết lỗi biên dịch. –

Trả lời

18

Kể từ C++ 11, literals người dùng định nghĩa tồn tại và là một phần của tiền xử lý . Ngữ pháp là:

preprocessing-token: 
    user-defined-string-literal 
    // other stuff... 

user-defined-string-literal: 
    string_literal ud-suffix 

ud-suffix: 
    identifier 

Vì vậy "("__DATE__ phù hợp tiền xử lý-thẻ, nhưng "("__DATE__ không (có nghĩa là hai thẻ tiền xử lý riêng biệt).

Thay thế macro xảy ra sau khi mã thông báo. Vì không có mã thông báo __DATE__ trong ví dụ đầu tiên của bạn nên không có sự thay thế nào.

+1

Trong trường hợp bất kỳ ai không nhận ra bộ tiền xử lý C++ khác với bộ tiền xử lý C ... bây giờ bạn làm :) –

+4

Với C++ 11 chữ người dùng định nghĩa trong VS 2015, bạn cũng có thể gặp sự cố với '' L "Hello , "L" World "' 'sẽ hoạt động trước nhưng không thành công với cùng một lỗi vì nó cố gắng sử dụng L thứ hai làm UDF. Bạn sửa nó bằng khoảng trắng: '' L "Xin chào," L "Thế giới" '' –

+0

Và may mắn bây giờ các chuỗi không phù hợp có thể được ghép nối - vì vậy thứ hai 'L' là không cần thiết! (http://stackoverflow.com/questions/31809141/concatenating-mismatched-string-works-in-vc2015-how) – Ajay

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