如何使用 -Werror 忽略 gcc 的 "useless storage class"?
How to ignore "useless storage class" with gcc using -Werror?
我用 -Werror
编译我的项目以确保我的所有代码都没有可识别的警告。但是,我当前的项目有一个 third-party 依赖项,其中有一个问题会导致警告 - 由于 -Werror
标志,该警告使我的构建失败。
我想使用 -Werror
标志,我不想更正 third-party 包。有没有办法忽略这个警告?
package.h:126:1: error: useless storage class specifier in empty declaration [-Werror]
};
产生错误的代码行是带有 "dangling" typedef 的结构定义。
typedef struct my_data_obj {
char* data;
uint32_t data_size;
};
这显然是一个错误 - 但我找不到任何 pragma
或任何此类机制来忽略从该 header 文件生成的警告。有什么想法吗?
编辑:解决方案
尽管我接受了 Florian Weimer 的回答,因为它最接近地回答了问题,但它并不是我最终解决的实际问题。我将在下面描述。通过将 headers 包含为系统 headers,我做了我想做的事情 - 无需修复包即可抑制错误。
我最后做的是创建一个补丁文件,并在每次构建项目时简单地应用该补丁。
vim package.h
# fix the file
git add package.h
git diff --cached > package.h.patch
# on build time
git apply package.h.patch
所有警告和错误都有特定的名称,并且可以在 per-warning/-error 的基础上启用或禁用。
例如,假设我有一个未使用的变量并启用了关于它的警告,那么我将收到类似于
的消息
/some/path/main.cpp:18:9: warning: unused variable ‘i’ [-Wunused-variable]
消息的最后一部分,即方括号内的部分,是特定警告的名称。
使用此名称,您可以使用 -Wno-<name of warning>
选项禁用警告。在上述警告的情况下,它被 -Wno-unused-variable
.
禁用
您的用例是一个 小 不同之处在于您想要禁用一个变成 错误 的警告。这与上面的非常相似,但是选项的一般形式是-Wno-error=<name of warning or error>
。在我们的示例中,它是 -Wno-error=unused-variable
.
这一切当然是in the GCC documentation, more specifically in the warning options documentation。
所以你要做的就是找出警告的名称,这样你就可以将它用于 -Wno-error=
选项。
我假设您想从要启用 -Werror
.
的文件中包含 package.h
GCC 没有单独的标志来控制此警告,否则编译器会打印它。使用单独的标志,您可以使用 #pragma GCC diagnostics ignore
,如其他答案中所示,可能带有包装头文件。
但是,您可以将头文件放在单独的目录中,而不是使用 -I
将其添加到包含路径,而是使用 -isystem
。因此,头文件被视为系统头文件,除非您还使用 -Wsystem-headers
进行编译,否则系统头文件中的警告将被抑制。
我用 -Werror
编译我的项目以确保我的所有代码都没有可识别的警告。但是,我当前的项目有一个 third-party 依赖项,其中有一个问题会导致警告 - 由于 -Werror
标志,该警告使我的构建失败。
我想使用 -Werror
标志,我不想更正 third-party 包。有没有办法忽略这个警告?
package.h:126:1: error: useless storage class specifier in empty declaration [-Werror]
};
产生错误的代码行是带有 "dangling" typedef 的结构定义。
typedef struct my_data_obj {
char* data;
uint32_t data_size;
};
这显然是一个错误 - 但我找不到任何 pragma
或任何此类机制来忽略从该 header 文件生成的警告。有什么想法吗?
编辑:解决方案
尽管我接受了 Florian Weimer 的回答,因为它最接近地回答了问题,但它并不是我最终解决的实际问题。我将在下面描述。通过将 headers 包含为系统 headers,我做了我想做的事情 - 无需修复包即可抑制错误。
我最后做的是创建一个补丁文件,并在每次构建项目时简单地应用该补丁。
vim package.h
# fix the file
git add package.h
git diff --cached > package.h.patch
# on build time
git apply package.h.patch
所有警告和错误都有特定的名称,并且可以在 per-warning/-error 的基础上启用或禁用。
例如,假设我有一个未使用的变量并启用了关于它的警告,那么我将收到类似于
的消息/some/path/main.cpp:18:9: warning: unused variable ‘i’ [-Wunused-variable]
消息的最后一部分,即方括号内的部分,是特定警告的名称。
使用此名称,您可以使用 -Wno-<name of warning>
选项禁用警告。在上述警告的情况下,它被 -Wno-unused-variable
.
您的用例是一个 小 不同之处在于您想要禁用一个变成 错误 的警告。这与上面的非常相似,但是选项的一般形式是-Wno-error=<name of warning or error>
。在我们的示例中,它是 -Wno-error=unused-variable
.
这一切当然是in the GCC documentation, more specifically in the warning options documentation。
所以你要做的就是找出警告的名称,这样你就可以将它用于 -Wno-error=
选项。
我假设您想从要启用 -Werror
.
package.h
GCC 没有单独的标志来控制此警告,否则编译器会打印它。使用单独的标志,您可以使用 #pragma GCC diagnostics ignore
,如其他答案中所示,可能带有包装头文件。
但是,您可以将头文件放在单独的目录中,而不是使用 -I
将其添加到包含路径,而是使用 -isystem
。因此,头文件被视为系统头文件,除非您还使用 -Wsystem-headers
进行编译,否则系统头文件中的警告将被抑制。