2016-07-21 19 views
10

C++ 17 giới thiệu thuộc tính [[maybe_unused]].
Tôi giả định đây là phiên bản tiêu chuẩn của GCC và Clang's: __attribute__((unused)).tôi có đặt [[có thể chưa sử dụng]] vào các khai báo hàm hay định nghĩa?

Đối với chức năng không sử dụng mà tôi không muốn nhìn thấy một cảnh báo từ,
tôi nên xác định các thuộc tính trên tờ khai

chức năng?

void maybe_used_function() [[maybe_unused]]; 

hoặc định nghĩa chức năng?

void maybe_used_function() [[maybe_unused]] { 
    /* impl */ 
} 

Hoặc là một? Cả hai?
Hiệu ứng có giống nhau đối với cả thuộc tính cụ thể của trình biên dịch và chuẩn hóa không?
Tôi không thể tìm thấy bất kỳ tài liệu rõ ràng nào về hành vi vị trí và thực tiễn phổ biến là gì.


Khi tôi đặt thuộc tính trước khi cơ quan chức năng trong một định nghĩa, GCC và kêu vang cho một lỗi:

void function(); 
int main(){} 
void function() __attribute__((unused)) {} 

cảnh báo: GCC không cho phép thuộc tính 'không sử dụng' ở vị trí này trên định nghĩa hàm [-Wgcc-compat] void function() __attribute __ ((chưa sử dụng)) {


Tuy nhiên, thuộc tính có thể được đặt ở hai địa điểm khác không có lỗi:

__attribute__((unused)) void __attribute__((unused)) function() {} 

Có lẽ một trong những cách này là cách tôi dự kiến ​​sử dụng thuộc tính trên định nghĩa chức năng?

+0

Bạn đã thử * và xem trình biên dịch thực sự nói gì? AFAIK, các thuộc tính đi trên các khai báo * chỉ *, nhưng tôi đã không kiểm tra lại văn bản chuẩn. –

+0

@ JesperJuhl: Trình biên dịch là sai trong trường hợp này và điều này là xa lạ thường, đặc biệt là khi thảo luận các tính năng ngôn ngữ _upcoming_ có thể hoặc có thể không được triển khai đúng (hoặc ở tất cả). – ildjarn

+0

@ildjarn lỗi GCC đến từ '__attribute __ ((chưa sử dụng))' not '[[may_unused]]'. Clang dường như cũng làm như vậy. –

Trả lời

5

Từ N4606, [dcl.attr.unused] ¶4:

A name or entity declared without the maybe_unused attribute can later be redeclared with the attribute and vice versa. An entity is considered marked after the first declaration that marks it.

Kể từ khi định nghĩa hàm một tuyên bố ([dcl.dcl] ¶1), điều này có nghĩa là bạn có thể đặt nó trong một trong hai nơi và nó sẽ hành xử giống nhau.

(Nó làm cho tinh thần để được phép ở cả hai nơi kể từ khi thuộc tính chỉ thực sự ảnh hưởng đến nét, nhưng vì các thuộc tính có thể đóng vai trò là tự tài liệu nó cũng là phép trên tờ khai.)

19

Cũng không. Trong

[[attr1]] void [[attr2]] f [[attr3]]() [[attr4]] {} 
  • attr1attr3 về phận sự (hoặc áp dụng) để f riêng của mình.
  • attr2 áp dụng cho loại trước, void.
  • attr4 appertains để loại f 's ("chức năng của () trở void), không f.

Bạn muốn maybe_unused để về phận sự để f, vì vậy bạn có thể đặt nó ở vị trí 1 hoặc 3, nhưng không phải 2 hoặc 4.

@ildjarn's answer bao gồm phần còn lại.

Đối với GCC của __attribute__, bạn sẽ phải kiểm tra giấy tờ của nó.

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