如何检测我的源代码中使用了哪些 C++11 功能
How to detect which C++11 features are used in my source code
假设我已经编写了这个C++程序(本质上什么都不做(
#include <cstdlib>
int main(int argc, char *argv[]) {
enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
constexpr float a = 3.1415f;
auto b = a;
return EXIT_SUCCESS;
}
有没有办法检测我的程序中使用了哪些 C++11 功能?是否有其他程序可以提取此信息我的源代码?这样的程序可以输出一个功能列表:
$ cat main.cc | some-clever-software
N2347
N1984
N2235
(或者,它可以输出 URL:s http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf 代替(
如果我有这样的列表,编写CMakeLists会更容易.txt它使用 CMake 命令 target_compile_features((,例如这个
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)
set(needed_features
cxx_strong_enums
cxx_constexpr
cxx_auto_type)
target_compile_features(foobar PRIVATE ${needed_features})
CMake 让我们选择的 C++11 功能列在 CMake 变量CMAKE_CXX_KNOWN_FEATURES中。我知道 CMake 命令 target_compile_features(( 尚未在稳定的 CMake 版本中发布。它目前位于开发分支中,因此将来可能会发生变化。但是,我仍然感兴趣,如果可以检测某些C++源代码中使用了哪些C++11功能。
更新:
在注释中建议不使用 -std=c++11 编译器选项进行编译:
首先使用 g++ 编译
$ g++ --version
g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ main.cc
main.cc: In function ‘int main(int, char**)’:
main.cc:4:3: warning: scoped enums only available with -std=c++11 or -std=gnu++11 [enabled by default]
enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
^
main.cc:5:3: error: ‘constexpr’ was not declared in this scope
constexpr float a = 3.1415f;
^
main.cc:5:13: error: expected ‘;’ before ‘float’
constexpr float a = 3.1415f;
^
main.cc:6:8: error: ‘b’ does not name a type
auto b = a;
^
然后用 clang 编译
$ clang --version
Debian clang version 3.2-7ubuntu1 (tags/RELEASE_32/final) (based on LLVM 3.2)
Target: x86_64-pc-linux-gnu
Thread model: posix
$ clang main.cc
main.cc:4:8: error: expected identifier or '{'
enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
^
main.cc:4:3: warning: declaration does not declare anything [-Wmissing-declarations]
enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
^~~~
main.cc:5:3: error: unknown type name 'constexpr'
constexpr float a = 3.1415f;
^
main.cc:5:13: error: expected unqualified-id
constexpr float a = 3.1415f;
^
main.cc:6:3: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
auto b = a;
^
main.cc:6:12: error: use of undeclared identifier 'a'
auto b = a;
^
2 warnings and 4 errors generated.
$
当然,编译器的诊断为我提供了哪些C++11正在使用的功能的良好提示。但我想要的是更细粒度的信息:
N2235
而不是
错误:"constexpr"未在此范围内声明
如前所述,这是对源代码的静态分析。使用一些简单的 grep,您可以识别一些 C++11 功能,例如 C++11 STL 容器,除了,使用移动语义,自动...
为了进行更微妙的分析,我建议使用 clang API 来解析代码源代码。您可以轻松检查一个函数(并知道是哪一个!(被删除了,constexpr...有了它,您可以做任何您想做的事情(创建报告,编写 CMake 文件......
在所有情况下,我认为没有多合一的工具,您将不得不自己编写一些部分。
你描述的是静态代码分析。规范工具当然是棉绒,但事情已经发生了变化。维基百科列出了23种C/C++工具。http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
不幸的是,他们都没有将符合特定C++级别列为一项功能。但是,其中许多是基于规则的,可以轻松添加自己的规则。您给出的示例完全符合其中许多工具的功能。
我不会推荐一个,部分原因是我知道的不够,部分原因是那只是一个意见。如果你很幸运,有人已经创建了一套规则来做你想做的事。
尝试将 Clang 与 -std=c++11 -Wc++98-compat
一起使用并解析错误输出。(Clang也有办法生成更有利于机器的诊断。这应该是相当完整的,尽管可能不是 100%,而且它绝对找不到您使用的仅限 C++11 的库功能。
- 如何使用lock_guard在c++11中实现scoped_lock功能
- 如何获得CMake Tools以在Visual Studio Code中编译具有C++11(或更高版本)功能的程序?
- C++11 功能 std::map::at 编译旧版本的C++
- C++03 和 C++11 之间的c_str功能规范的差异
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- 如何实现声明功能-C 11,编译时间
- 如何在不接触函数本身的情况下暂停和恢复 C++11 std::thread 的功能
- C 11螺纹 - 非静态成员功能的使用无效 - 工作GCC 5.1.0损坏的GCC 7.3.1
- 实现功能对象绑定而无需使用C 11
- 这是 clang c++11 std::regex_match 的功能还是错误?
- C 11和C 14之间的功能签名差异
- C 11使用删除指定符与私人功能
- 此constexpr虚拟功能技术是否违反了任何C 11/C 14规则
- 获取交换功能的分段错误11
- 语法在C 11中获取功能指针
- 将C 11设置功能更改为带有转发的现代模板功能是一个好主意
- C++11 具有与不同版本的 GCC 兼容的功能
- 如何在C 11中创建指针映射以静态成员功能
- 示例功能处理时间装饰器在C 11中
- 如何在C 11之前进行咖喱功能