为什么 -pedantic 开关不会为 g++ 中的 gnu-extension 代码提供错误?

问题描述

这是我的库代码。这里我使用的是 asprintf,它是 sprintf 的 gnu 扩展。

因此,如果启用 -pedantic 开关,我希望编译器会抛出错误

但是在创建目标文件时我没有收到错误/警告/消息。

#include <iostream>
#include <stdio.h>

using namespace std;

int testPrint()
{
  char *arr;
  asprintf(&arr,"%d",10);
  cout<<"testPrint called"<<endl;
  return 1;
}

命令:

g++ -pedantic -Werror test.cpp -c

为了打印非标准 C++ 使用的错误,我应该做哪些更改。

-pedantic 用法的相关 SO 问题:how-to-disable-gnu-c-extensions

解决方法

GCC 文档的 description of the -pedantic option 声明:

-Wpedantic
-pedantic

发出严格的 ISO C 和 ISO C++ 要求的所有警告;拒绝所有使用禁止扩展的程序,以及其他一些不遵循 ISO C 和 ISO C++ 的程序。对于 ISO C,遵循由使用的任何 -std 选项指定的 ISO C 标准版本。

[…]

一些用户尝试使用 -Wpedantic 来检查程序是否符合严格的 ISO C 一致性。他们很快发现它并没有完全按照他们的意愿行事:它发现了一些非 ISO 实践,但不是全部——只有那些 ISO C 需要诊断的实践,以及一些已经添加了诊断的其他实践。

报告不符合 ISO C 的任何功能在某些情况下可能很有用,但需要大量的额外工作,并且与 -Wpedantic 完全不同。我们没有计划在不久的将来支持此类功能。

-pedantic 不是严格的 ISO 标准一致性检查。它所做的只是启用标准要求的警告。使用 -std=c++XX 还会禁用语言扩展。

asprintf 是 C 库(很可能是 glibc)的一个特性,而不是编译器的特性。编译器开关通常不会将库公开的功能用于语言标准指定的功能。 (毕竟,遵循这一逻辑结论意味着编译器应该阻止您使用标准库以外的任何库,因为它们不是由语言标准指定的。)

如果您想禁用 C 库的非标准功能,glibc 提供了 feature test macros 用于此目的。 asprintf 是在定义 _GNU_SOURCE 宏时公开的。在包含标准库头文件之前确保未定义宏将用于该目的......如果不是因为 libstdc++ requires _GNU_SOURCE to be enabled.

考虑到这一点,我认为您的问题没有解决方案,只要您坚持使用 G++ 和 libstdc++。