为什么GCC的诊断编译指示对一些警告类型无效?

5

我注意到GCC的诊断#pragma仅支持部分警告。

这个是有效的:

#pragma GCC diagnostic error "-Wconversion"

这会失败:

#pragma GCC diagnostic error "-Wframe-larger-than=32"

...出现错误:

error: unknown option after '#pragma GCC diagnostic' kind [-Werror=pragmas]
#pragma GCC diagnostic error "-Wframe-larger-than"

当作为命令行参数传递时,这两个参数都可以在GCC中使用。


是否有文档介绍GCC diagnostic指示符支持哪些警告?

2个回答

5

我找到的最好的东西是:

这里的GCC手册:

pragma GCC diagnostic kind option: 修改诊断的处理方式。请注意,并非所有诊断都可以修改;目前只有警告(通常由“-W…”控制)可以被控制,而且并非所有警告都可以被控制。使用-fdiagnostics-show-option来确定哪些诊断可以被控制以及哪个选项来控制它们。

还有这里的GCC手册:

目前,只有C++前端可以支持这些选项。 ... -fdiagnostics-show-option: 此选项指示诊断机制向发出的每个诊断添加文本,该文本指示直接控制该诊断的命令行选项,当诊断机制已知这样的选项时。

https://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Language-Independent-Options.htm

1
那么结论是什么?为什么它会失败的答案是什么?请通过编辑(更改)您的答案来回复,而不是在评论中回复(不要包含“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天写的)。 - Peter Mortensen

3
我怀疑你已经发现了GCC在此特定选项下的错误。
使用以下基本示例(请参见实时):
#include <stdio.h>

int main(void)
{
    int i = 4;

    printf("%d\n", i);

    return 0;
}

当使用-Wframe-larger-than=2编译时,会出现警告信息:

警告:帧大小为16字节,大于2字节 [-Wframe-larger-than=]

然而,使用-Werror=组合选项(即完整标志为-Werror=frame-larger-than=2)时,表现出一种奇怪的方式:

错误:帧大小为16字节,大于1字节 [-Werror=frame-larger-than=]

更奇怪的是,它似乎完全忽略该值,因为-Werror=frame-larger-than=64仍会产生相同的错误,尽管阈值已满足(即16 < 64)。
(附注:GCC版本为4.9.0)
我认为-Werror=选项处理与#pragma GCC diagnostic error有所关联,因为以下内容似乎是有效的:
#include <stdio.h>

#pragma GCC diagnostic error "-Wframe-larger-than="
int main(void)
{
    int i = 4;

    printf("%d\n", i);

    return 0;
}

返回一个错误,内容为:

错误:帧大小为16字节,大于1字节[-Werror=frame-larger-than=]

但是它不能与任何值合作,例如:

#pragma GCC diagnostic error "-Wframe-larger-than=2"

输出结果:

警告:#pragma GCC diagnostic kind 后面未知选项 [-Wpragmas]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接