2012-02-21 26 views
9

Tôi có một số mã (cũ) mà tôi đang xây dựng bằng tiếng kêu đầu tiên. Mã này là một cái gì đó như:Có công tắc nào để vô hiệu hóa các dấu vết với tiếng kêu không?

sprintf(buf, "%s <%s ????>", p1, p2); 

Clang đưa ra cảnh báo sau (lỗi với -Werror):

test.c:6:33: error: trigraph converted to '}' character [-Werror,-Wtrigraphs] 
    sprintf(buf, "%s <%s ????>", p1, p2); 
         ^

??> không có ý định như một trigraph, vì vậy tôi muốn vô hiệu hóa trigraphs hoàn toàn (các nguồn không cố ý sử dụng chúng ở bất cứ đâu).

Tôi đã thử -no-trigraphs nhưng đó không phải thực sự là một lựa chọn:

clang: warning: argument unused during compilation: '-no-trigraphs' 

tôi có thể tắt trigraphs cảnh báo với -Wno-trigraphs nhưng tôi không muốn chuyển đổi trigraph để thực sự diễn ra ở tất cả.

LƯU Ý: Trigraphs được kích hoạt như là một tác dụng phụ không mong muốn khi sử dụng -std=c89.

+2

Ouch! GCC có một chính sách hợp lý để bỏ qua các trigraph, ngay cả trong chế độ tuân thủ nghiêm ngặt, trừ khi bạn nắm tay nó vào lửa với '-trigraphs'. Thời gian để thoát ra khỏi 'sed'? Hoặc tương đương. –

+3

Trên thực tế các chế độ tuân thủ nghiêm ngặt của GCC ('-std = c89',' -std = c99', v.v.) bật chuyển đổi trigraph. – zwol

+1

Và nếu có ai thắc mắc WTH là một dấu vết. [Đây là con ngựa] (http://stackoverflow.com/questions/7825055/what-does-the-c-operator-do) ... – Mysticial

Trả lời

6

Hãy thử sử dụng gnu * Chế độ - "Trigraphs mặc định bị tắt trong gnu * chế độ, họ có thể được kích hoạt bởi các tùy chọn -trigraphs." (xem http://clang.llvm.org/docs/UsersManual.html#c_modes để biết các khác biệt và chuyển đổi dòng lệnh khác)

+0

Ah, đó là nó! Tôi đã sử dụng '-std = c89', nhưng với' -std = gnu89' tôi nhận được thông báo 'error: trigraph bỏ qua [-Werror, -Wtrigraphs]' mà tôi có thể vô hiệu hóa với '-Wno-trigraphs'. –

+2

Có cách nào để vô hiệu hóa các dấu vết mà không cho phép mở rộng gnu không? – bames53

4

Tôi không thể nhìn thấy một cách rõ ràng để vô hiệu hóa các dấu vết (chứ không phải là cảnh báo trigraphs). Có lẽ là cách dễ nhất để sửa chữa mã này là để thay đổi nó thành:

sprintf(buf, "%s <%s ????"">", p1, p2); 
+0

Điều đó có vẻ giống như một lựa chọn hợp lý. Trong hàng triệu dòng nguồn, '??>' chỉ xuất hiện bốn lần. –

+0

'" ... ??? \?> "' Cũng sẽ hoạt động. Đặt dấu gạch chéo ngược giữa hai dấu hỏi của chính nó. – zwol

+0

Vì các dấu phẩy có thể xuất hiện ở bất kỳ đâu, có thể là «sed» s/?? \ ([- <>() \/= # '] \) /? \\? \ 1/g "' để chuyển đổi bất kỳ dấu vết nào thành chuỗi an toàn . Mặt khác, bên ngoài của một chuỗi, có lẽ các trigraph sẽ được chuyển đổi tốt nhất để hình thức tiêu chuẩn của nó? Nó có một chút khó khăn để quyết định những gì tốt nhất. (Chỉ một lần, kịch bản 'sed' của tôi sử dụng dấu ngoặc kép xung quanh mẫu, bởi vì có một dấu trích dẫn duy nhất trong mẫu.) –

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