2008-12-15 47 views
36

Tên macro kiểu C có tuân theo cùng các quy tắc đặt tên như số nhận dạng không? Sau khi nâng cấp trình biên dịch, nó hiện đang phát ra cảnh báo này cho một ứng dụng kế thừa:Ký tự hợp lệ cho tên macro là gì?

warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text 
    #define   CHAR_&  38 

Dòng mã này xác định hằng số giá trị ASCII cho dấu và.

#define DOL_SN  36 
#define PERCENT  37 
#define CHAR_&  38 
#define RT_SING  39 
#define LF_PAR  40 

Tôi cho rằng định nghĩa này (không được tham chiếu bởi bất kỳ mã nào, theo như tôi có thể biết) là lỗi và phải được thay đổi thành "CHAR_AMPERSAND"?

Trả lời

32

tên Macro chỉ nên bao gồm các ký tự chữ và dấu gạch dưới, ví dụ: 'a-z', 'A-Z', '0-9', và '_', và ký tự đầu tiên không phải là một chữ số. Một số bộ tiền xử lý cũng cho phép ký tự ký hiệu đô la '$', nhưng bạn không nên sử dụng nó; tiếc là tôi không thể báo giá chuẩn C vì tôi không có bản sao của nó.

Từ GCC documentation:

tokens tiền xử lý rơi thành năm lớp lớn: định danh, số tiền xử lý, chuỗi literals, punctuators, và khác. An số nhận dạng giống với số nhận dạng trong C: bất kỳ chuỗi nào của chữ cái, chữ số hoặc dấu gạch dưới, trong đó bắt đầu bằng chữ cái hoặc dấu gạch dưới. Từ khóa của C không có ý nghĩa đối với bộ tiền xử lý; chúng là số nhận dạng thông thường . Ví dụ: bạn có thể xác định macro có tên là từ khóa. Số nhận dạng duy nhất có thể là được coi là từ khóa tiền xử lý là defined. Xem Xác định.

Điều này chủ yếu đúng với các ngôn ngữ khác sử dụng bộ tiền xử lý C. Tuy nhiên, một vài từ khóa của C++ là đáng kể ngay cả trong bộ tiền xử lý. Xem các toán tử có tên C++.

Trong tiêu chuẩn 1999 C, định danh có thể chứa các chữ cái mà không phải là một phần của “bộ ký tự nguồn cơ bản”, tại của việc thực hiện theo ý (ví dụ như chữ Latinh có dấu, Hy Lạp chữ cái, hoặc chữ tượng hình Trung Quốc) . Bạn có thể thực hiện này bằng bộ ký tự mở rộng hoặc các chuỗi '\u''\U' thoát . Việc thực hiện tính năng này trong GCC là thử nghiệm; các ký tự chỉ được chấp nhận trong các mẫu '\u''\U' và chỉ khi sử dụng -fextended-identifiers.

Là một tiện ích mở rộng, GCC xử lý '$' làm một thư . Điều này là để tương thích với một số hệ thống, chẳng hạn như VMS, trong đó '$' thường được sử dụng trong các tên hàm và đối tượng được xác định hệ thống .'$' không phải là một chữ cái trong chế độ tuân thủ nghiêm ngặt, hoặc nếu bạn chỉ định tùy chọn -$. Xem số Gọi.

+4

ISO/IEC 9899: TC3 6.10/1 chỉ định ngữ pháp của các chỉ thị tiền xử lý, làm rõ rằng tên macro chia sẻ cùng một quy tắc giống như định danh. 6.4.2.1/1 chỉ định quy tắc cho số nhận dạng. – saffsd

6

Bạn nói đúng, các quy tắc tương tự áp dụng cho macro và số nhận dạng theo như tên có liên quan: ký tự hợp lệ là [A-Za-z0-9_].

Cách sử dụng phổ biến để sử dụng tên CAPITALIZED để phân biệt các macro từ các số nhận dạng khác - các biến và tên hàm.

1

Các quy tắc tương tự chỉ định số nhận dạng hợp lệ cho tên biến áp dụng cho tên macro ngoại trừ các macro có thể có cùng tên với từ khóa. Ký tự hợp lệ trong tên mã định danh bao gồm digitsnon-digits và không được bắt đầu bằng chữ số. non-digits bao gồm các chữ cái in hoa A-Z, chữ thường a-z, dấu gạch dưới và bất kỳ ký tự được xác định nào được triển khai.

+0

"ngoại trừ các macro có thể có cùng tên với từ khóa" - vâng, nhưng cũng có nhiều ngoại lệ hơn mà macro có thể không có cùng tên với từ khóa tiền xử lý này: được định nghĩa –

7

clang cho phép rất nhiều nhân vật "điên" .. mặc dù tôi đã phải vật lộn để tìm bất kỳ nhiều vần hay lý do - để tại saomột số được cho phép, và những người khác là không. Ví dụ ..

#define ?:   /// WORKS FINE 
#define ■ @end  /// WORKS FINE 
#define @interface /// WORKS FINE 
#define P @protocol /// WORKS FINE 

chưa

#define ☎ TEL  /// ERROR: Macro name must be an identifier. 
#define ❌ NO  /// ERROR: Macro name must be an identifier. 
#define ⇧ UP  /// ERROR: Macro name must be an identifier. 
#define 〓 ==  /// ERROR: Macro name must be an identifier. 
#define APPLE /// ERROR: Macro name must be an identifier. 

Ai mà biết được. Tôi rất muốn ... nhưng Google đã thất bại, cho đến nay. Bất kỳ cái nhìn sâu sắc về chủ đề, sẽ được đánh giá cao ™ ️.

+0

Xem xét tài liệu hướng dẫn. Hoặc nếu nó thậm chí không được ghi lại, hãy kiểm tra mã nguồn của nó cho nó từ mã nguồn mở của nó. Nhưng theo tiêu chuẩn C tôi có thể nói với bạn tất cả chúng đều không hợp lệ. và vì nó không được hỏi về bất kỳ môi trường liên quan đến môi trường nào, nhưng đối với đồng bằng C. Vì vậy, điều này thậm chí còn phù hợp hơn như một câu hỏi tách biệt như một câu trả lời và có lẽ nó thậm chí còn được gắn cờ như vậy. ... Ngay cả một cái khá tốt. Tôi sẽ hỏi điều này nếu bạn không định làm thế. – dhein

+0

@Zaibis kiểm tra [Điều gì cấu thành Mã định danh C hợp lệ?] (Http://stackoverflow.com/q/34319000/547214) –

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