小编Bru*_*ams的帖子

为什么std :: numeric_limits <seconds> :: max()返回0?

我找到了一个有趣的问题,std::numeric_limits<seconds>::max()返回0.答案是使用seconds::max()std::numeric_limits<seconds::rep>::max()替代,但我很想知道为什么会发生这种情况.我希望它在编译时失败或者只是工作.以下代码演示了gcc 4.9.3的问题.

#include <iostream>
#include <limits>
#include <chrono> 

using namespace std;
using namespace std::chrono;

int main(int /*argc*/, const char* /*argv*/[])
{
    const auto maxSeconds = std::numeric_limits<seconds>::max();
    std::cerr << maxSeconds.count() << "\n";
    const auto maxSeconds2 = seconds::max();
    std::cerr << maxSeconds2.count() << "\n";
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在chrono头文件中看不到任何隐式转换.如果a duration已隐式转换为数字类型并且符号丢失或者bool您最终可能最小为零 - 但最大值为零则没有意义.


正如TartanLlama指出的那样,默认特化使用默认构造函数,因此返回0.

深入研究标准的旧副本,我看到以下dictats:

18.3.2.3类模板numeric_limits[numeric.limits]

非算术标准类型,如complex<T>(26.4.2),不应具有专业化.

过了一会儿:

默认numeric_limits<T>模板应包含所有成员,但具有0或false值.

numeric_limitscv限定类型的特化的每个成员的值cv T应等于非限定类型的特化成员的相应成员的值 T. …

c++ language-lawyer

18
推荐指数
2
解决办法
898
查看次数

为整个项目生成 godoc 文档?

我一直在与 godoc 搏斗,发现“go doc”更多地用于从命令行提供使用帮助,例如:

go doc -cmd -u
Run Code Online (Sandbox Code Playgroud)

列出包注释和任何函数(或其他实体)

go doc *function*
Run Code Online (Sandbox Code Playgroud)

然后显示单个功能(或其他实体)的文档

似乎有一个名为godoc的相关工具。godoc 似乎还基于每个包和功能生成 html。例如

godoc -html hello
Run Code Online (Sandbox Code Playgroud)

生成仅包含包注释的 html 到 stdout

godoc是一个非常令人困惑的名字,因为我们也有go doc

如何为整个项目创建静态文档?

这类似于Godoc,为整个包创建 html,这可能被误解为询问包的文档而不是项目。我想要一个可以在原则上可能包含许多包和应用程序的项目中使用的构建步骤。

go godoc

16
推荐指数
2
解决办法
2万
查看次数

如何将带有多行单元格的表格添加到 VSTS 中的自述文件中?

如何在 Microsoft VSTS 中将带有多行单元格的表格添加到 Markdown?

我之前在 github 上使用 asciidoc 作为自述文件,因为它既丰富又不那么模糊。该公司现在在不支持 asciidoc 的 VSTS 上有项目,所以我需要改用 Markdown。但是,目前尚不清楚实际支持哪种降价方式

这个页面说可以使用github风味的markdown

https://docs.microsoft.com/en-us/vsts/collaborate/markdown-guidance

我发现另一个页面说他们通过markdown-it使用 commonmark

问:VS Code 是否支持 GitHub Flavored Markdown?

答:不,VS Code 使用 markdown-it 库针对 CommonMark Markdown 规范。GitHub 正在朝着 CommonMark 规范迈进,您可以在此更新中阅读该规范。

我一直在使用 asciidoctor 和 pandoc 的组合来转换文件,但没有什么能完全正确。(Asciidoctor 转换为 docbook,然后 pandoc 可以解析)

asciidoctor -b docbook -v -o "$OUTPUT".xml "$INPUT" &&
pandoc -f docbook -t markdown_github -i "$OUTPUT".xml -o "$OUTPUT"
Run Code Online (Sandbox Code Playgroud)

我必须手动重新添加标题。我目前的绊脚石是多行单元格。Github 支持网格表,请参阅Markdown 表中的换行符?

+---------------+---------------+--------------------+
| Fruit         | Price         | Advantages …
Run Code Online (Sandbox Code Playgroud)

markdown azure-devops

10
推荐指数
1
解决办法
1万
查看次数

C++到Java:有效地搜索集合

来自一个主要是C++的背景,我现在正在愤怒地写一些Java.我发现在C++中使用STL基本的东西似乎在Java中比我认为的更麻烦.我的结论是,我还有一个更好的Java习惯用法.这是一个使用伪代码的例子.

我有一些基于一些成员变量的自然排序关系的东西,这些变量恰好是字符串.

class Thing
{
   String key1;
   String key2;
}
Run Code Online (Sandbox Code Playgroud)

在C++中,我可能会定义一个排序运算符<(Thing,Thing)并将它们放在一个std :: set中.例如

///
/// @brief
/// provide a total order for 'Things' using key1 and key2
///
bool operator<(const Thing& a, const Thing& b)
{
  if (a.key1 < b.key1) return true; 
  else if (a.key1 > b.key1) return false; 
  else return a.key2 < b.key2;
} 
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用set :: find在具有Thing的情况下在O(log N)时间内找到元素.使用运算符<()的其他重载.我可以使用std :: lower_bound或std :: equal_range搜索只有key1或同时拥有key1和key2.例如:

struct Ordering
{
   /// A strict weak ordering not a total ordering
   bool operator()(const Thing& A,const std::string& …
Run Code Online (Sandbox Code Playgroud)

c++ java collections map set

8
推荐指数
1
解决办法
2427
查看次数

强制或阻止使用特定的次要版本的libstdc ++

为了使用C++ 11和c ++ 14的功能,我有一个使用较新版本的gcc(4.9.1)编译的应用程序,因此是一个较新版本的libstdc ++.该应用程序由许多小程序组成,因此我将libstdc ++作为共享库而不是静态库链接(即我不希望使用-static-libstdc ++)

我希望使用/ opt // lib64下的应用程序发布新版本的libstdc ++(注意:这是在GPL例外情况下特别允许的)

新版本的libstdc ++.so与目标平台上的版本只有次要版本不同.libstdc ++旨在向前兼容,以便现有程序可以使用新版本的库.但是,当一些程序使用新版本而不是旧版本时,我观察到行为(即错误)的细微差别.我希望防止这种情况发生.

我还发现,ld将尝试我的应用程序使用的libstdc系统版本链接++,除非我把的/ opt // lib64的较早的LD_LIBRARY_PATH.据说你可以使用强制链接特定版本-l:<library>.<version>,但是,这似乎不起作用.我怀疑它会用于用户创建的库,但不会用于像libstd ++这样的语言运行库,因为gcc本身会生成链接器脚本.同样在我的一个目标平台(RHEL5)上,gcc/ld甚至都不理解它.我认为这可以通过使用-nostdlib并在我的构建系统中链接所需的所有内容(例如-lgcc),而不是将它留给我更喜欢的gcc.到目前为止我还没试过这个.

解决此问题的一种简单方法是确保LD_LIBRARY_PATH在运行我的应用程序时包含/ opt // lib64,否则或者我可以将LD_PRELOAD与正确的库版本一起使用.如果有人决定忽略我的建议和运行,这个问题

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/<vendor>/lib64 
Run Code Online (Sandbox Code Playgroud)

它可能会导致细微而难以诊断的问题.所以我一直在寻找更好的方法.

我想知道是否有某种方法我可以将libstdc ++重命名为lib_stdc ++并链接到该soname.重命名libstdc ++是不够的,因为您需要更改readelf给出的文件中的soname.即

0x000000000000000e (SONAME)             Library soname: [libstdc++.so.6]
Run Code Online (Sandbox Code Playgroud)

如果你在一个正常的程序上执行此操作,gcc即使使用-l:stdc++.so.6.0.20说,你会发现这给出了主要版本,而不是特定的次要版本.即

readelf -d <myapp>
0x0000000e (SONAME)                     Library soname: [libstdc++.so.6]
Run Code Online (Sandbox Code Playgroud)

而不是:

0x0000000e (SONAME)                     Library soname: [libstdc++.so.6.0.20]
Run Code Online (Sandbox Code Playgroud)

所以我改为使用我想要依赖的soname创建一个虚拟共享库,以便添加依赖项,如下所示:

gcc dummy.o -Wl,-soname,lib<vendor>_stdc++.so.6.0.20 -nostdlib -shared -o lib<vender>_dummycpp.so
Run Code Online (Sandbox Code Playgroud)

(其中dummy.o是一个空的目标文件,由空的源文件制成,用于停止-nostdlib导致投诉)

然后:

gcc <myapp> -l<vendor>_dummycpp
Run Code Online (Sandbox Code Playgroud)

根据需要,我现在得到:

readelf -d <myapp>

0x0000000000000001 (NEEDED)             Shared library: …
Run Code Online (Sandbox Code Playgroud)

c++ linux gcc libstdc++ c++11

8
推荐指数
1
解决办法
1546
查看次数

HPX最小双节点示例设置?

HPX入门教程 假设您使用的是PBS或slurm.这些在HPC社区中可能很常见,但作为开发人员,我更习惯这里的场景是你可以安装的几台机器.

现在不是很明显是否需要像slurm这样的调度程序来利用多个物理机器或者只是方便管理集群.

我知道你可以在运行HPX应用程序时使用-l标志模拟多个地点(例如参见这个问题)我想要的是在2个节点上运行相同的应用程序并让它们相互通信.

告诉HPX需要的最低要求是:
这是另一台具有此IP地址的计算机,您可以向其发送任务吗?

或者,达到这个阶段的最低浆液配置是什么?

安装slurm很容易找到一个简单的2节点示例.虽然这个链接到播客可能会有所帮助

我还假设HPX的parcel端口只能在TCP上工作而无需安装任何额外的东西(例如MPI).它是否正确?


更新 我觉得我越来越近但我仍然缺少一些东西.首先我使用的是hello_world示例.难道它对于2节点测试来说太简单了吗?我希望类似的输出在同一节点上运行2个地点:

APP=$HPX/bin/hello_world
$APP --hpx:node 0 --hpx:threads 4 -l2 &
$APP --hpx:node 1 --hpx:threads 4 
Run Code Online (Sandbox Code Playgroud)

样本输出:

hello world from OS-thread 2 on locality 0
hello world from OS-thread 0 on locality 0
hello world from OS-thread 1 on locality 1
hello world from OS-thread 3 on locality 1
hello world from OS-thread 2 on locality 1
hello world from OS-thread 1 on locality 0
hello world …

c++ hpx

8
推荐指数
2
解决办法
880
查看次数

为什么 HTTP 状态代码 102 从 HTTP/1.1 中删除

为可能需要很长时间才能完成的 REST 服务返回状态 102 似乎有时是个好主意。更好的想法通常是返回 202 接受,并引用带有请求状态的 URL,并且在准备好时将得到最终答案。

我从https://evertpot.com/http/102-processing注意到状态代码 102 不在 HTTP/1.1 规范 ( rfc2616 ) 中。 为什么被删除?

既然如此,为什么还有很多人仍在使用和推荐它呢?是不是因为大多数服务必须支持 HTTP/1.0 以实现向后兼容,因此它无论如何都可能被实现?

http

8
推荐指数
1
解决办法
2919
查看次数

正确设置已安装软件包的导入cmake目标的位置

我希望能够从已安装的库中导入目标,但是使用时:

install(TARGETS
        foobar
        EXPORT foobarLibTargets
        LIBRARY DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)

cmake生成一个包含绝对路径的foob​​arLibTargets.cmake

set_target_properties(foobar PROPERTIES
        IMPORTED_LOCATION_NOCONFIG "/where/I/happened/to/build/libfoobar.so"
        IMPORTED_SONAME_NOCONFIG "libfoobar.so"
)
Run Code Online (Sandbox Code Playgroud)

这样,使用从安装中导入的目标的构建将由于路径不存在而失败。

问:如何获取正确的相对位置?

这等效于:

set_target_properties(foobar PROPERTIES
                      IMPORTED_LOCATION_NOCONFIG "@PACKAGE_LIBRARY_INSTALL_DIR@/libfoobar.so")
Run Code Online (Sandbox Code Playgroud)

如果我看另一个工作类似但可行的项目,它有:

set_target_properties(foobar PROPERTIES
         IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libfoobar.so"
         IMPORTED_SONAME_RELEASE "libfoobar.so"
)
Run Code Online (Sandbox Code Playgroud)

以下是一些重现此问题的示例文件:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.7)
project(FOOBAR VERSION 1.2.3)
set(VERSION 1.2.3)

set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib:$ORIGIN/")
set(CMAKE_INSTALL_PREFIX "/opt/foobar" CACHE PATH "Install path prefix" FORCE)

add_library(foobar SHARED
  foobar.cpp
)

set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)
set(CPACK_PACKAGE_NAME "foobar")

set(CPACK_PACKAGE_VERSION ${VERSION})
set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")

include(CPack)

# Indicate the content of the distribution pakcages
install(FILES
  ${CMAKE_SOURCE_DIR}/foobar.h
  DESTINATION include
) …
Run Code Online (Sandbox Code Playgroud)

cmake

8
推荐指数
2
解决办法
465
查看次数

为什么 not_null 还没有进入 C++ 标准?

"// not null"在第 N 次将注释添加到原始指针后,我再次想知道not_null模板发生了什么。

C++ 核心指南是在很久以前创建的,并且一些内容已经纳入标准,例如std::span(有些内容类似于string_view核心std::array指南本身并且起源于核心指南本身,但有时会被混淆)。鉴于其相对简单,为什么 not_null (或类似的东西)还没有将其纳入标准?

我定期扫描 ISO 邮件(但可能不彻底),而且我什至不知道有这样的建议。


可能回答我自己的问题。我不记得遇到过任何可以防止我编写的代码出现错误的情况,因为我们尽量不以这种方式编写代码。

这些指南本身很受欢迎,例如 clang-tidy 和声纳。支持库似乎不太受欢迎。

例如,boost 从一开始就作为 Linux 上的软件包提供。我不知道 GSL 有任何实现。不过,我认为它与 Windows 上的 Visual C++ 捆绑在一起。


既然评论里有人问了。

我自己会用它来记录意图。像这样的构造not_null<>可能具有注释所没有的语义价值。尽管我可以看到它的位置,但执行它是次要的。这最好以零开销来完成(也许仅在有限数量的情况下在编译时)。

我主要考虑的是原始指针成员变量的情况。我忘记了将指针传递给函数的情况,对于该函数,我总是使用引用来表示非空,也表示“我不取得所有权”。

同样(对于班级成员)我们也可以记录所有权owned<> not_owned<>

我想还有是否允许更改关联对象。但这可能太高了。您可以使用引用成员而不是指针来记录这一点。我自己避免引用成员,因为我几乎总是想要可复制和可分配的类型。但是,请参见示例:我应该在成员数据中选择指针还是引用?对此进行一些讨论。

另一个维度是另一个实体是否可以修改变量。“const”表示我保证不修改它。在多线程代码中,我们想说的几乎相反。那就是“其他代码承诺在我们使用它时不会修改它”(没有显式锁定),但这远离主题......

c++ cpp-core-guidelines

8
推荐指数
1
解决办法
2440
查看次数

'cmake rebuild_cache' for*just*a subdirectory?

I have an issue with the generation of makefiles stage of CMake being slow which is similar to this unanswered question:

CMake is slow to generate makefiles

My project is made up of a top level CMakeLists.txt file which uses add_subdirectory() to add various subprojects for individual library and executable components.

For a given component, the CMakeLists.txt file contains something like:

add_library(mylib SHARED
  sourceFile1.cpp
  sourceFile2.cpp
  ...
)
Run Code Online (Sandbox Code Playgroud)

I can build just the contents of that directory using:

make mylib
Run Code Online (Sandbox Code Playgroud)

If …

build-process build cmake meson-build

7
推荐指数
1
解决办法
2322
查看次数