小编acm*_*acm的帖子

可以实现BOOST_PP_DEFINED吗?

是否有可能编写一个类似函数的C预处理器宏,1如果定义了它的参数则返回,0否则?让我们BOOST_PP_DEFINED通过与其他boost预处理器宏类比来调用它,我们可以假设它们也在起作用:

#define BOOST_PP_DEFINED(VAR) ???

#define XXX
BOOST_PP_DEFINED(XXX)  // expands to 1
#undef XXX
BOOST_PP_DEFINED(XXX)  // expands to 0
Run Code Online (Sandbox Code Playgroud)

我期待使用的结果BOOST_PP_DEFINEDBOOST_PP_IIF:

#define MAGIC(ARG) BOOST_PP_IIF(BOOST_PP_DEFINED(ARG), CHOICE1, CHOICE2)
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望扩展MAGIC(ARG)根据扩展时是否ARG定义而变化MAGIC:

#define FOO
MAGIC(FOO)  // expands to CHOICE1 (or the expansion of CHOICE1)
#undef FOO
MAGIC(FOO)  // expands to CHOICE2 (or the expansion of CHOICE2)
Run Code Online (Sandbox Code Playgroud)

我还发现以下内容不起作用(有点令人惊讶):

#define MAGIC(ARG) BOOST_PP_IIF(defined(arg), CHOICE1, CHOICE2)
Run Code Online (Sandbox Code Playgroud)

因为defined当用作#if表达式的一部分时,显然只在预处理器中有效.

我有点怀疑增强预处理器尚未提供BOOST_PP_DEFINED …

c++ macros boost c-preprocessor boost-preprocessor

6
推荐指数
1
解决办法
351
查看次数

C99:是否可以可移植地确定两个指针是否指向同一聚合体?

在c99中,我的理解是比较两个不指向同一聚合的指针会导致未定义的行为.给定聚合A,已知指向A内的指针p_good和可能指向或不指向A内的指针p_unknown,是否可以构造具有定义行为的可移植测试,该行为确定比较p_good和p_good是否安全. p_unknown?

显然,这个测试本身不能违反比较指针的限制.

我怀疑答案是'不',但我很乐意以其他方式表现出来.

c pointers c99 undefined-behavior

5
推荐指数
1
解决办法
573
查看次数

reinterpret_cast用于未对齐内存访问与memcpy的有效用例?

在snappy的内部,有一个有条件编译的部分选择取消引用reinterpret_cast'ed指针作为在已知支持此类操作的体系结构上可能未对齐的16,32和64位整数的读写的最佳实现(如86).其他架构的后备是使用基于memcpy的实现.

我的理解是reinterpret_cast实现展示了未定义的行为,并且clang的未定义行为清理程序确实标记了它.

令我困惑的是:为什么不使用基于memcpy的实现呢?我希望除了最破碎的编译器之外的所有编译器都使用内在函数来实现这些memcpy调用,因为在编译时已知大小.实际上,我希望在任何现代工具链上都可以使用相同的codegen.

然而,我也认识到,snappy是由知道它们是什么的人写的.所以这让我想知道使用reinterpret_cast机制是否还有一些优势,这种机制超过了它的未定义行为.不希望性能依赖于编译器的实现质量?我没有考虑过的其他事情?

c++ clang memcpy reinterpret-cast snappy

5
推荐指数
1
解决办法
1006
查看次数

mongoDB c ++ 11驱动程序获取插入文档的ID

我正在使用新的c ++ 11 mongoDB驱动程序(不是旧版驱动程序).

我在插入新文档后试图在mongoDB中获取文档的"id".此ID位于返回值"retVal3"中.

    struct core::v1::optional<mongocxx::v_noabi::result::insert_one> retVal3 = collection.insert_one(document.view());
Run Code Online (Sandbox Code Playgroud)

这是没有auto命令的操作.我希望Eclipse能够解决这个问题并帮助我从中获取ID.不工作.

调试时我可以看到ID.它保存在12字节数组中.以十六进制显示它显示ID.这个结构深入到这个结构中.

retVal3 ==> core::v1::impl::storage<mongocxx::v_noabi::result::insert_one, false> ==>

val ==> _generated_id ==> _b_oid ==> value ==> _bytes ==> _M_elems char [12]
Run Code Online (Sandbox Code Playgroud)

我不知道如何从这个结构/对象中获取这12个字节.它是一个对象吗?

是否存在功能?你知道另一种方法吗?

谢谢

document get mongodb c++11 mongo-cxx-driver

5
推荐指数
1
解决办法
1314
查看次数

Mongodb C++ 正则表达式查询

如何在 C++ 中使用正则表达式查询 MongoDB 数据库。

mongo-cxx-driver-r3.1.1

听到包括

#include <cstdlib>
#include <iostream>
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/uri.hpp>
#include <cstdint>
#include <vector>
#include <mongocxx/stdx.hpp>
#include <bson.h>
#include <conio.h> 
#include <sstream> 
#include <stdio.h> 
#include <string>
#include <bsoncxx/types.hpp>
#include <mongocxx/exception/exception.hpp>
#include <bsoncxx/builder/basic/document.hpp>
#include <bsoncxx/builder/basic/kvp.hpp>

using bsoncxx::builder::stream::close_document;
using bsoncxx::builder::stream::document;
using bsoncxx::builder::stream::finalize;
using bsoncxx::builder::stream::open_document;
using bsoncxx::builder::basic::kvp;
using bsoncxx::builder::basic::make_document;
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的。

  void MyClass::on_querybtn_clicked()
   {

auto collection = conn["TestDB"]["fdevices"];
bsoncxx::types::b_regex::b_regex();//i am lost here dont know how to use it
auto cursor = collection.find({});

 for …
Run Code Online (Sandbox Code Playgroud)

c++ regex mongodb mongo-cxx-driver

5
推荐指数
1
解决办法
697
查看次数

为什么-mmacosx-version-min = 10.10不能阻止使用标记为10.11开头的函数?

通过我对可用性宏和-mmacosx-version-min标志如何工作的理解,在针对OS X 10.10时,以下代码应该无法编译:

#include <Availability.h>
#include <CoreFoundation/CoreFoundation.h>
#include <Security/Security.h>

#if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
#error
#endif

#if __MAC_OS_X_VERSION_MIN_REQUIRED < 101000
#error __MAC_OSX_VERSION_MIN_REQUIRED too low
#endif

#if __MAC_OS_X_VERSION_MIN_REQUIRED > 101000
#error __MAC_OSX_VERSION_MIN_REQUIRED too high
#endif

int main() {

    size_t len = 0;

    SSLContextRef x{};
    auto status = SSLCopyRequestedPeerNameLength(x, &len);
    return status != 0;
}
Run Code Online (Sandbox Code Playgroud)

因为该功能SSLCopyRequestedPeerNameLength在10.11中标记为可用SecureTransport.h:

$ grep -C5 ^SSLCopyRequestedPeerNameLength /System/Library/Frameworks//Security.framework/Headers/SecureTransport.h

/*
 * Server Only: obtain the hostname specified by the client in the ServerName extension (SNI)
 */
OSStatus …
Run Code Online (Sandbox Code Playgroud)

c++ macos xcode abi clang

5
推荐指数
1
解决办法
302
查看次数

哪个是前瞻性名称,vc_redist.&lt;arch&gt;.exe 或 vcredist_&lt;arch&gt;.exe?

似乎 Microsoft Visual C++ 提供了可在两种名称格式下重新分发的 VC++ 运行时的等效副本。

VS2017:

@ /cygdrive/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Redist/MSVC/14.16.27012
$ cksum.exe vcredist_* vc_redist.*
4227323895 15311608 vcredist_x64.exe
1446350140 14636936 vcredist_x86.exe
646937804 7271400 vc_redist.arm64.exe
4227323895 15311608 vc_redist.x64.exe
1446350140 14636936 vc_redist.x86.exe
Run Code Online (Sandbox Code Playgroud)

VS2019:

@ /cygdrive/c/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Redist/MSVC/14.23.27820
$ cksum.exe vcredist_* vc_redist.*
4163206349 15073600 vcredist_x64.exe
1076245464 14373272 vcredist_x86.exe
4163206349 15073600 vc_redist.x64.exe
1076245464 14373272 vc_redist.x86.exe
Run Code Online (Sandbox Code Playgroud)

我不确定为什么 VS2019 安装没有 arm64 版本(也许我没有安装支持?),但基于 Windows ARM64 支持较新的事实,这一切都表明:

  • 这些可再发行软件包正在进行重命名。
  • 由于内容相同,一组名称是现在的兼容性名称,另一组是前进的名称。
  • 这些vc_redist.<arch>.exe名称似乎是较新的格式,这是基于 ARM64 以该格式存在的事实,并且 ARM64 支持在 Windows 中是新的。

然而,一些搜索没有显示任何文件来支持这些结论。如果我想保持兼容,我应该使用哪种名称格式?支持 MSVC 文档的链接将是理想的选择。

windows packaging crt visual-c++

5
推荐指数
1
解决办法
342
查看次数

在调试信息压缩标志的各种组合下,压缩的调试信息如何在汇编器和链接器之间流动?

gcc 和 binutils 中有许多关于调试信息压缩的标志。在这里,我对标准类型的 C++ 项目中以下四个标志之间的相互作用感兴趣,该项目使用编译器创建许多目标文件,然后使用编译器驱动链接步骤,将目标文件组合成各种最终二进制文件:

  • -Wa,--compress-debug-sections=zlib-gabi
  • -Wa,--nocompress-debug-sections
  • -Wl,--compress-debug-sections=zlib-gabi
  • -Wl,--compress-debug-sections=none

所以,我们可以想象四种可能性。我们已经在汇编器中不压缩或使用 编译了目标文件-Wa,--compress-debug-sections=zlib-gabi,并且在链接器中不压缩或-Wl,--compress-debug-sections=zlib-gabi启用了将目标文件链接到二进制文件中。

-Wa,--nocompress-debug-sections编译 和 的组合-Wl,--compress-debug-sections=none很无趣。据推测根本没有发生压缩。

接下来的两个组合更有趣:

  • 对于-Wa,--compress-debug-sections=zlib-gabi汇编器和-Wl,--compress-debug-sections=none链接器,链接器似乎需要花时间从每个对象文件中解压缩调试信息,然后再合并它并为最终二进制文件发出新的未压缩调试信息部分。

  • 对于-Wa,--nocompress-debug-sections汇编器和-Wl,--compress-debug-sections=zlib-gabi链接器,很明显汇编器不会花时间压缩目标文件的调试信息,而链接器将花时间压缩最终合并的调试信息部分。

我对这两种情况的假设和理解大部分都是正确的吗?如果不是,我误解了什么?

这就留下了最有趣的情况:

  • 对于-Wa,--compress-debug-sections=zlib-gabi汇编器和-Wl,--compress-debug-sections=zlib-gabi链接器,这里会发生什么?如果我对上述情况的理解是正确的,我希望汇编器会完成压缩每个目标文件中的调试信息的工作,然后链接器需要花时间解压缩它,然后进行合并,最后重新压缩合并调试信息部分。那是对的吗?或者链接器是否能够以某种方式神奇地直接将目标文件中的压缩调试信息部分直接合并到链接步骤的最终压缩调试信息部分中,从而避免解压缩/重新压缩循环?

总的来说,我只是想了解应该在构建系统中将这些标志默认为什么以获得最佳构建性能。我当然会做一些基准测试,但我也有兴趣了解这里的操作理论,因为它将帮助我了解围绕这些标志的任何构建基准测试结果。

compression linker binutils

5
推荐指数
1
解决办法
1512
查看次数

为什么 clang sanitizer 在链接共享库时不链接 sanitizer 运行时

在地址清理程序的文档中(https://releases.llvm.org/7.0.0/tools/clang/docs/AddressSanitizer.html),它指出:

链接共享库时,AddressSanitizer运行时未链接,因此-Wl,-z,defs可能会导致链接错误

不仅 ASAN 如此,UBSAN 也是如此。事实证明,这对于 UBSAN 来说特别不方便,因为清理程序可以在库之间引入新的类型信息依赖关系( https://jira.mongodb.org/browse/SERVER-49798vptr中有很多详细信息)。

我真的更喜欢使用-Wl,-z,defsUBSAN 构建。实际上,我可以通过手动将诸如-lclang_rt.ubsan_standalone-x86_64共享库的链接行之类的内容注入到编译过程中的 ubsan 构建中来实现这一点。

但这给我留下了一个棘手的问题:为什么链接驱动程序在链接共享库时不clang根据显式文档自动执行此操作?它显然可以做到这一点,因为它已经为自动获取运行时的程序做到了这一点。事实上,它明确并没有让我怀疑这样做是否存在某种问题。

  • 由于某种原因,将运行时库强制ubsan到所有共享库的链接线上是否是一个坏主意?
  • 它是否会以某种方式削弱消毒剂的有效性?
  • 还有其他我没有看到的可怕的缺点吗?

c++ linker shared-libraries address-sanitizer ubsan

5
推荐指数
0
解决办法
750
查看次数

MongoDB C++:mongocxx :: pool线程安全吗?

获取连接时是否必须手动锁定mongocxx :: pool?

即这样安全吗?(从Mongo网站复制的例子)

mongocxx::instance instance{};
mongocxx::pool pool {mongocxx::uri{}};

using mongocxx::pool::entry = std::unique_ptr<client, std::function<void (client*)>>

auto threadfunc = [](mongocxx::client &client, stdx::string_view dbname) {
    client[dbname]["col"].insert({});
}
// don't even bother sharing clients. Just give each thread its own,
std::thread([]() {
    // pool.acquire() returns a mongo::pool::entry type
    mongocxx::client *c= pool.acquire().get();
    threadfunc(*c, "db1");
    threadfunc(*c, "db2");
});

std::thread([]() {
    mongocxx::client *c = pool.acquire().get();;
    threadfunc(*c, "db2");
    threadfunc(*c, "db1");
});
Run Code Online (Sandbox Code Playgroud)

c++ multithreading mongodb mongo-cxx-driver

4
推荐指数
1
解决办法
1141
查看次数