问题描述
这是我的库代码。这里我使用的是 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++。