该工具include-what-you-use可用于检测不需要的标头.我正在使用CMake来完成我的C++软件项目.如何指示CMake在我的软件项目的源文件上自动运行包含什么?
让我们说我已经编写了这个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;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法检测我的程序中使用的C++ 11功能?是否有其他程序可以从我的源代码中提取这些信息?这样的程序可以输出一系列功能:
$ cat main.cc | some-clever-software
N2347
N1984
N2235
Run Code Online (Sandbox Code Playgroud)
(或者它可以输出URL:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf)
如果我有这样的列表,那么编写一个使用CMake命令target_compile_features()的CMakeLists.txt会更容易,比如这个
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})
Run Code Online (Sandbox Code Playgroud)
CMake让我们可以选择的C++ 11功能列在CMake变量CMAKE_CXX_KNOWN_FEATURES中.我知道CMake命令target_compile_features()尚未在稳定的CMake版本中发布.它目前存在于开发分支中,因此将来可能会发生变化.但是,如果有可能检测到某些C++源代码中使用了哪些C++ 11特性,我感兴趣.
更新:
在评论中建议不使用-std = c ++ 11编译器选项进行编译:
首先用g ++ …
如果构造函数的执行顺序很重要,我如何使用std :: make_tuple?
例如,我猜A类的构造函数和类B的构造函数的执行顺序未定义为:
std::tuple<A, B> t(std::make_tuple(A(std::cin), B(std::cin)));
Run Code Online (Sandbox Code Playgroud)
在阅读了对该问题的评论后,我得出了这个结论
这就是说
template<typename... args>
std::tuple<args...> parse(std::istream &stream) {
return std::make_tuple(args(stream)...);
}
Run Code Online (Sandbox Code Playgroud)
实现具有未定义的构造函数的执行顺序.
更新,提供一些上下文:
为了给我想要做的更多背景,这里是一个草图:
我想在CodeSynthesis XSD二进制解析/序列化的帮助下从stdin中读取一些序列化对象.以下是如何完成此类解析和序列化的示例:example/cxx/tree/binary/xdr/driver.cxx
xml_schema::istream<XDR> ixdr (xdr);
std::auto_ptr<catalog> copy (new catalog (ixdr));
Run Code Online (Sandbox Code Playgroud)
我希望能够指定序列化对象具有的类的列表(例如,目录,目录,3个序列化对象的someOtherSerializableClass)并将该信息存储为typedef
template <typename... Args>
struct variadic_typedef {};
typedef variadic_typedef<catalog, catalog, someOtherSerializableClass> myTypes;
Run Code Online (Sandbox Code Playgroud)
并在解析完成后找到一种方法来使用std :: tuple.草图:
auto serializedObjects(binaryParse<myTypes>(std::cin));
Run Code Online (Sandbox Code Playgroud)
其中serializedObjects将具有该类型
std::tuple<catalog, catalog, someOtherSerializableClass>
Run Code Online (Sandbox Code Playgroud) $ wget --quiet http://download.qt-project.org/official_releases/qt/5.2/5.2.1/qt-opensource-windows-x86-msvc2012_64_opengl-5.2.1.exe
$
Run Code Online (Sandbox Code Playgroud)
如上所示,我首先在Cygwin Bash shell中下载了Visual Studio的Qt包.
旁注:Cygwin中打包的Qt库对我没用,因为我需要使用Visual Studio C++编译器.
首先,我在文件上设置了正确的权限
$ chmod 755 qt-opensource-windows-x86-msvc2012_64_opengl-5.2.1.exe
Run Code Online (Sandbox Code Playgroud)
如果我这样开始
$ ./qt-opensource-windows-x86-msvc2012_64_opengl-5.2.1.exe
Run Code Online (Sandbox Code Playgroud)
显示了一个图形窗口(GUI),但这不是我想要的,因为我后来希望将安装过程写入我可以在Cygwin中运行的Bash脚本.
如果我添加选项--help,就像这样
$ ./qt-opensource-windows-x86-msvc2012_64_opengl-5.2.1.exe --help
Run Code Online (Sandbox Code Playgroud)
打开一个新的终端窗口,其中包含以下文本
Usage: SDKMaintenanceTool [OPTIONS]
User:
--help Show commandline usage
--version Show current version
--checkupdates Check for updates and return an XML file describing
the available updates
--updater Start in updater mode.
--manage-packages Start in packagemanager mode.
--proxy Set system proxy on Win and Mac.
This option has no effect on Linux.
--verbose Show …Run Code Online (Sandbox Code Playgroud) g ++说
错误:函数'constexpr std :: tuple的参数太多了
如果我在std::make_tuple通话中省略了static_cast
#include <tuple>
typedef int (*func_t)();
int number() {
return 2;
}
double number(bool a) {
return 1.2;
}
int main() {
// With a static_cast it compiles without any error
// std::tuple<func_t> tup = std::make_tuple(static_cast<func_t>(number));
std::tuple<func_t> tup = std::make_tuple(number);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是完整的错误消息:
$ g++ -std=c++11 test.cc
test.cc: In function 'int main()':
test.cc:31:54: error: too many arguments to function 'constexpr std::tuple<typename std::__decay_and_strip<_Elements>::__type ...> std::make_tuple(_Elements&& ...) [with _Elements = {}; typename std::__decay_and_strip<_Elements>::__type …Run Code Online (Sandbox Code Playgroud) 我在当前项目中使用BeanBinding很多,所以我的代码看起来像......
TypeA objA;
TypeB objB;
Bindings.createAutoBinding(UpdateStrategy.READ,
objA, BeanProperty.create("X"),
objB, BeanProperty.create("X"))
.bind();
Run Code Online (Sandbox Code Playgroud)
凡objA和objB是有一个类的实例setX()方法.问题在于,如果我重构setX,setY那么我需要搜索这些字符串属性名称.我意识到我可以为属性名创建静态最终字符串但是如果我能让编译器为我做的工作,那就更好了.
理想情况下,我希望能够做到的是......
TypeA obja;
TypeB objB;
Bindings.createAutoBinding(UpdateStrategy.READ,
objA, BeanProperty.create( Magic.returnBeanName(TypeA.class).getX() ),
objB, BeanProperty.create( Magic.returnBeanName(TypeB.class).setX() )
.bind();
Run Code Online (Sandbox Code Playgroud)
看起来这可能通过一些代码综合和/或方面来实现.
似乎podman system migrate有时需要升级 podman 存储的文件的文件格式或目录结构。(我假设更改发生在目录 ~/.local/share/containers/ 下)
有没有一个命令可以告诉我是否podman system migrate需要运行?
这个问题是关于 podman 的无根使用(即以普通用户身份运行 podman)。
非 root 用户一直在尝试运行 podman 和 buildah 命令,但现在只想将所有内容重置为开始实验之前的状态(即所有容器映像和容器应与 buildah 和 podman 配置一起删除)。
我最好的猜测是跑步
testuser@linux:~$ rm -rf ~/.local/share/containers/
Run Code Online (Sandbox Code Playgroud)
可能会起作用。
为此你推荐什么命令?
Ubuntu 18.04.2 与 https://launchpad.net/~projectatomic/+archive/ubuntu/ppa
testuser@linux:~$ dpkg -l|grep podm
ii podman 1.3.2-1~dev~ubuntu18.04~ppa15 amd64 Manage pods, containers and container images.
testuser@linux:~$ dpkg -l|grep buildah
ii buildah 1.9.0-1~dev~ubuntu18.04~ppa17 amd64 A command line tool used for creating OCI images.
testuser@linux:~$
Run Code Online (Sandbox Code Playgroud) 我的主目录中几乎没有剩余磁盘空间,但目录/scratch/tmpexperiment中有大量磁盘空间。该目录现在是空的。
我想尝试一下命令podman和buildah(只是为了实验和学习)。实验结束后我想删除目录/scratch/tmpexperiment。
是否可以指示podman并buildah仅在 /scratch/tmpexperiment下创建和写入文件?
最好我的主目录在实验期间保持不变(或至少尽可能少地修改)。
我的用户没有 sudo 权限。这个问题是关于 podman 和 buildah 的非 root(无根)使用。安装的软件版本为podman 1.4.0和1.9.0-dev。
有一个运行Gerrit的服务器,我没有ssh登录权限。我有一个具有管理员权限的Gerrit帐户。
如何创建新的Gerrit项目,然后将远程Git存储库导入其中?我希望所有信息都可以迁移,例如分支机构和标签。
以下是更多信息:
Gerrit服务器主机名:gerrit.example.com
旧的Git存储库URL:ssh://git@git.example.com/foobar
新的Gerrit项目名称:foobar
具有管理员权限的Gerrit用户帐户:erik
我使用tortoiseSVN来同步我们的代码.但最近我发现有一些不太方便的东西.当我修改文件时,让我们说a.jsp,我的同事也可能修改这个文件,a.jsp,这可能会导致冲突,任何一个使用都需要先检查他的代码,另一个将需要更新到最新版本,然后逐个解决冲突,这实际上是错误的.
所以我需要在陆龟SVN中使用一些函数,它可以在我编辑时锁定a.jsp,并防止其他同事同时修改文件.我在tortoiseSVN中尝试了"锁定"功能,但它不起作用,当我锁定a.jsp文件时,我的同事仍然可以同时修改此文件而不进行任何提升和提醒,就像"你的同事正在修改这个文件,请修改,直到签入"...
还有更好的解决方案吗?提前致谢 !!
如果我编译C++程序/tmp/src/main.cc
#include <iostream>
int main() {
#ifdef demo1
std::cout << "Output from demo1\n";
#endif
#ifdef demo2
std::cout << "Output from demo2\n";
#endif
}
Run Code Online (Sandbox Code Playgroud)
使用文件/tmp/src/CMakeLists.txt中的构建指令
cmake_minimum_required(VERSION 3.11)
project(test_save_temps LANGUAGES CXX)
function(my_add_executable name)
add_executable(${name})
target_sources(${name} PRIVATE main.cc)
# target_compile_options(${name} PRIVATE --save-temps)
target_compile_definitions(${name} PRIVATE
${name}
)
endfunction()
my_add_executable(demo1)
my_add_executable(demo2)
Run Code Online (Sandbox Code Playgroud)
一切看起来都不错。
cmake_minimum_required(VERSION 3.11)
project(test_save_temps LANGUAGES CXX)
function(my_add_executable name)
add_executable(${name})
target_sources(${name} PRIVATE main.cc)
# target_compile_options(${name} PRIVATE --save-temps)
target_compile_definitions(${name} PRIVATE
${name}
)
endfunction()
my_add_executable(demo1)
my_add_executable(demo2)
Run Code Online (Sandbox Code Playgroud)
但是如果我从文件/tmp/src/CMakeLists.txt中删除注释 以激活该行
target_compile_options(${name} PRIVATE --save-temps)
Run Code Online (Sandbox Code Playgroud)
并做同样的事情
ubuntu@laptop:/tmp$ mkdir …Run Code Online (Sandbox Code Playgroud)