2015-11-11 23 views
5

Tôi có một số mã sử dụng literals số nguyên lớn như sau:Làm thế nào để bịt miệng cảnh báo hằng số nguyên dài dài từ GCC

if(nanoseconds < 1'000'000'000'000) 

Điều này cho phép trình biên dịch cảnh báo integer constant is too large for 'long' type [-Wlong-long]. Tuy nhiên, nếu tôi thay đổi thành:

if(nanoseconds < 1'000'000'000'000ll) 

... Thay vào đó, tôi nhận được cảnh báo use of C++11 long long integer constant [-Wlong-long].

Tôi muốn tắt cảnh báo này chỉ dành cho dòng này, nhưng không tắt -Wlong-dài hoặc sử dụng -Wno-long-long cho toàn bộ dự án. Tôi đã thử xung quanh nó với:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wlong-long" 
... 
#pragma GCC diagnostic pop 

nhưng điều đó dường như không hoạt động ở đây với cảnh báo này. Có cái gì khác tôi có thể thử?

Tôi đang xây dựng với -std=gnu++1z.

Edit: ví dụ tối thiểu cho ý kiến:

#include <iostream> 
auto main()->int { 
    double nanoseconds = 10.0; 
    if(nanoseconds < 1'000'000'000'000ll) { 
    std::cout << "hello" << std::endl; 
    } 
    return EXIT_SUCCESS; 
} 

Tòa nhà có g++ -std=gnu++1z -Wlong-long test.cpp cho test.cpp:6:20: warning: use of C++11 long long integer constant [-Wlong-long]

tôi nên đề cập này là trên một nền tảng 32bit, Windows với MinGW-w64 (gcc 5.1.0) - cảnh báo đầu tiên dường như không xuất hiện trên hệ thống Linux 64 bit của tôi, nhưng cảnh báo thứ hai (với hậu tố ll) xuất hiện trên cả hai.

+1

tôi không thể tái tạo cảnh báo này và nó cũng không có ý nghĩa gì vì tại sao các tính năng C++ 11 không có sẵn với '-std = gnu ++ 1z'? Bạn có thể hiển thị một ví dụ làm việc tối thiểu và cung cấp cho phiên bản trình biên dịch chính xác của bạn và cờ bạn sử dụng? – 5gon12eder

+0

'dài nano giây = 10; if (nanoseconds <1000000000000ll) std :: cout << 1000000000000ll; 'làm việc cho tôi trong' gcc5.2' với tùy chọn '-std = gnu ++ 1z' ​​ – gjha

+0

Tôi đã cập nhật câu hỏi với một ví dụ tối thiểu và một dòng lệnh để tái tạo . Tôi đồng ý nó không có ý nghĩa để cảnh báo về việc sử dụng các tính năng C++ 11 trong tình huống này. – Riot

Trả lời

3

Dường như cảnh báo C++ 11 khi sử dụng hậu tố ll có thể là a gcc bug. (Cảm ơn @praetorian)

Một cách giải quyết (lấy cảm hứng từ bình luận @ nate-Eldredge của) là để tránh sử dụng theo nghĩa đen và có nó được sản xuất tại thời gian biên dịch với constexpr:

int64_t constexpr const trillion = int64_t(1'000'000) * int64_t(1'000'000); 
if(nanoseconds < trillion) ... 
Các vấn đề liên quan