我在 Fedora 16 上使用 GNU gcc 4.6.2。我正在使用第 3 方 API 编写应用程序,编译后,我收到很多警告。
warning: ‘typedef’ was ignored in this declaration [enabled by default]
只是想知道如何抑制这种情况?我用 -Wall 标志编译我的程序。
在本文档中,http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html,它提到了类似 -Wunused-local-typedefs 的内容。
我已经尝试过-Wno-unused-local-typedefs,但不起作用。
谢谢。
-Wno-unused-local-typedefs
适用于 GCC 4.8。
gcc 允许您指定某些库包含路径应被视为带有 -isystem
开关的
system库,该开关允许这些标头相对于您在其余代码中使用的标志进行特殊处理。例如,如果您在
test.cpp
中使用某些 Boost 库而未使用本地 typedef(我最近使用包括 Boost signals2
库时遇到了这个问题)
g++ -o test{,.cpp} -Wall -Wextra -Werror -I /usr/local/boost-1.55.0/include -L /usr/local/boost-1.55.0/lib
并且上面的构建不干净,请尝试以下
g++ -o test{,.cpp} -Wall -Wextra -Werror -isystem /usr/local/boost-1.55.0/include -L /usr/local/boost-1.55.0/lib
这将会(前提是来自您包含在
test.cpp
中的 Boost 库的警告当然是您唯一的问题)。
根据gcc-source-code(gcc/cp/decl.c:4108):
warning (0, "%<typedef%> was ignored in this declaration");
gcc 4.6.2 中没有命令行标志(即 0 代表的意思)来抑制此警告。
由于
-Wunused-local-typedefs
是 -Wall
的一部分,请确保 -Wall
之后没有 -Wno-unused-local-typedefs
。如果这样做,-Wall
只需再次打开该选项即可。
此 GCC 警告意味着您的 typedef 可能重复,您应该删除 typedef 关键字。例如:
typedef enum class Something {
THING1,
THING2,
} Something;
上面的代码是类型重复的,因为枚举类已经被定义为类型。所以你必须删除 typedef 关键字以及末尾的 Something!
[[maybe_unused]]
。
有关所有属性的概述,请参阅 http://en.cppreference.com/w/cpp/language/attributes。
提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0212r0.pdf
(抱歉,我无法发布示例,因为 stackoverflow 认为它缩进得很严重)
如果您因为尝试声明透明比较运算符而遇到此问题(例如,因为您想通过键搜索但使用
std::set
),那么您确实可以使用 C++ [[maybe_unused]]
属性来给出提示给编译器。
例如,给定一个包含
GraphNode
字段的 val
结构体,这是关键,你可以写:
struct Comp {
[[maybe_unused]] typedef std::true_type is_transparent;
bool operator()(int key, GraphNode* node) const {
return key < node->val;
}
// etc
};
using nodes_t = std::set<GraphNode*, Comp>;
即使打开所有警告,此功能也有效。我的 Makefile 说:
CXX = g++-13
CXXFLAGS := -Wall -Wextra -Wpedantic -Werror -std=c++23
您还可以使用带有类型别名的属性:
struct Comp {
using is_transparent [[maybe_unused]] = std::true_type;
// etc
};