Trong một dự án lớn, tôi đã nhận được một số cảnh báo trình biên dịch từ g ++ - 5.1.1 chỉ khi xây dựng phiên bản phát hành (sử dụng cờ tối ưu) nhưng không phải trong khi xây dựng phiên bản gỡ lỗi (vô hiệu hóa tối ưu hóa trình biên dịch nhất). Tôi đã thu hẹp sự cố xuống ví dụ tối thiểu được liệt kê bên dưới với các lệnh để tái tạo sự cố. Vấn đề không xảy ra nếu tôi sử dụng g ++ - 4.8.4. Có phải là lỗi này trong g ++ - 5.1.1 không? Hay, đoạn mã này có làm điều gì sai trái và bảo đảm cảnh báo đó không? Tại sao nó không tạo ra bất kỳ cảnh báo nào cho ba trường hợp cuối cùng được liệt kê trong mã (xem phần chỉnh sửa ở dưới cùng để giải thích)?g ++ - 5.1.1 cảnh báo về biến không sử dụng chỉ khi cờ tối ưu hóa được sử dụng
Đối với những người quan tâm, đây là bug report trong Bugzilla của GCC.
/*
This code complains that the variable 'container' is unused only if optimization
flag is used with g++-5.1.1 while g++-4.8.4 does not produce any warnings in
either case. Here are the commands to try it out:
$ g++ --version
g++ (GCC) 5.1.1 20150618 (Red Hat 5.1.1-4)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -c -std=c++11 -Wall -g -O0 test_warnings.cpp
$ g++ -c -std=c++11 -Wall -O3 test_warnings.cpp
test_warnings.cpp:34:27: warning: ‘container’ defined but not used [-Wunused-variable]
const std::array<Item, 5> container {} ;
^
*/
#include <array>
struct Item
{
int itemValue_ {0} ;
Item() {} ;
} ;
//
// The warning will go away if you do any one of the following:
//
// - Comment out the constructor for Item.
// - Remove 'const' from the next line (i.e. make container non-const).
// - Remove '{}' from the next line (i.e. remove initializer list).
//
const std::array<Item, 5> container {} ;
//
// These lines do not produce any warnings:
//
const std::array<Item, 5> container_1 ;
std::array<Item, 5> container_2 ;
std::array<Item, 5> container_3 {} ;
Edit: Như đã đề cập bởi Ryan Haining trong các ý kiến, container_2
và container_3
sẽ có extern
liên kết và trình biên dịch không có cách nào cảnh báo về việc sử dụng của họ.
'container_2' và' container_3' sẽ có liên kết 'extern' tiềm ẩn, vì vậy không thể biết chúng có được sử dụng –
@RyanHaining hay không, tốt về hai điểm đó. Tôi sẽ để chúng ở đó để hoàn thành tất cả bốn kết hợp (có/không có 'const' và' {} '). – crayzeewulf