小编NoS*_*tAl的帖子

G ++ -D选项添加数字1

我知道标题很奇怪,所以这里是解释:

我有一些代码,我宁愿不修改,但我需要重新定义一些函数.最小的例子是这样的:

int main()
{
strcpy_s(a,b);
}
Run Code Online (Sandbox Code Playgroud)

但当我运行这个:

$ g++ -E -P -w -D"strcpy_s(D,S)   strcpy(D,S) buahaha" test.cpp
Run Code Online (Sandbox Code Playgroud)

我明白了:

int main()
{
strcpy(a,b) buahaha 1;
}
Run Code Online (Sandbox Code Playgroud)

这是什么1?忽略buahaha,这只是为了表明PP有所作为.

c++ g++ c-preprocessor

0
推荐指数
1
解决办法
162
查看次数

是否可以在不使用boost的情况下在C++ 11中编写这样的代码?

前一阵子我偶然发现了以下一行代码:

 return accumulate(s, s + size, char(), (_1 ^ _2));
Run Code Online (Sandbox Code Playgroud)

它使用的是boost标题,但我一直认为它非常非常优雅(注意lambda没有命名输入参数,所以它超短.:)请注意我知道C++ 11有lambda函数,这是不是关于lambdas,而是关于这个很好的短语法.

c++ lambda boost c++11

0
推荐指数
1
解决办法
226
查看次数

有没有办法强制窗口在套接字调用上产生短读/写?

这是出于调试目的.
为了测试代码的短发送/短接收处理部分是否正常工作......
有没有办法强制Windows生成短发送/ rcvs,即使是从/向socket读取/写入的少量字节?
我更喜欢每个进程执行此操作,但如果每个进程都无法完成此操作,我就可以测试Firefox/Outlook代码如何处理这个问题了.:)

我知道我可以手动添加巨大的消息来强迫这个,但我正在处理具有多层内容的巨大旧代码库,所以即使添加一个充满随机字节的简单巨大的消息也是非常重要的.:)

c c++ sockets winapi winsockets

0
推荐指数
1
解决办法
158
查看次数

在预提交钩子中调用 git

我在运行 git pre-commit hook 时得到了奇怪的结果,例如,当我在终端中执行 git diff --name-only 时,它似乎给出了与在 .git/hooks/pre-commit 中执行时不同的结果

所以我的问题是:

  1. 我可以在 git hooks 中调用 git 吗?
  2. 如果 1. 可以:如果我执行 git commit -am"bla" ,那么预提交钩子到底什么时候被调用?特别是 git 是否先进行暂存,然后调用预提交挂钩?

我问这个是因为我尝试了 2 或 3 次:我修改文件,我手动运行脚本,它打印出来

#! /bin/sh -xv
files=$(git diff --name-only)
+ git diff --name-only
+ files=path/to/file.h
echo $files
+ echo path/to/file.h
path/to/file.h
...
Run Code Online (Sandbox Code Playgroud)

当我执行 git commit -am"eh" 时,输出会有所不同

#! /bin/sh -xv
files=$(git diff --name-only)
+ git diff --name-only
+ files=
echo $files
+ echo
Run Code Online (Sandbox Code Playgroud)

git pre-commit-hook

0
推荐指数
1
解决办法
1563
查看次数

std::multimap 等于 _range 和 C++20 std::views::values 不能很好地协同工作

我有以下代码,它可以工作,但是 C++20 版本看起来并不比 C++17 版本好多少。我的猜测问题是multimap equal_range返回 apair并且范围无法确定这是一对有效的迭代器。

有没有办法用更短更好的方式来写这个?

#include <iostream>
#include <map>
#include <ranges>

int main() {
    std::multimap<bool,int> oddness{{false,2}, {true,3}, {true,47}, {false,74656}};
    // nice, does not work:
    // oddness.equal_range(true) | std::views::values;
    // works:
    oddness | std::views::values;

    // working code:
    auto odds = oddness.equal_range(true);
    const auto odds_view = std::views::values(std::ranges::subrange(odds.first, odds.second));
    for (const auto& odd : odds_view) {
        std::cout << odd << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ c++20 std-ranges

0
推荐指数
1
解决办法
86
查看次数

为什么 C++20 中的空结构没有隐式飞船运算符?

动机:有时我使用 std::variant 来实现“花式”枚举,其中一些枚举状态可以携带状态。

现在,如果我想将<=>用于我的变体,它需要我的空结构已经定义 <=>。这对我来说似乎有点奇怪,因为如果类型具有 0 位状态,则该类型的所有实例都是相同的。

完整示例

#include <compare>
#include <iostream>
#include <variant>

struct Off{
    // without this the code does not compile
    auto operator<=>(const Off& other) const = default;
};

struct Running{
    int rpm=1000;
    auto operator<=>(const Running& other) const = default;
};

using EngineState = std::variant<Off, Running>;

int main()
{
    EngineState es1, es2;
    es1<=>es2;
}
Run Code Online (Sandbox Code Playgroud)

c++ spaceship-operator c++20

-1
推荐指数
1
解决办法
119
查看次数

执行 PIMPL 时如何避免共享指针开销

AFAIKunique_ptr与 PIMPL 一起使用非常棘手,因为删除器是unique_ptr类型的一部分,因此它不适用于不完整的类型。另一方面,shared_ptr使用动态删除器,因此它可以处理不完整的类型。

shared_ptr无论我是否需要,都存在给我原子操作的性能问题。

我可以使用其他更快的替代方案吗std::?我显然对类型擦除很满意,我说的是原子引用计数的成本。

#include <any>
#include <memory>
#include <iosfwd>

std::shared_ptr<std::fstream> sp;
// unique_ptr requires complete type
// std::unique_ptr<std::fstream> up;
std::any a;

#include <fstream>
int main() {
    // any requires copy_constructible
    // a = std::fstream{};  
    sp = std::make_shared<std::fstream>();
} 
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 我考虑过any,但它不适用于某些类型。
  • 我考虑使用动态删除器的 unique_ptr ,但据我所知构造unique_ptr函数永远不会“告诉”删除器构造的对象是什么(为删除器提供一种学习如何销毁对象的方法)。

PS 我知道很久以前boost::shared_ptr就有宏来禁用原子引用计数,但即使仍然支持我也不想切换到boost::shared_ptr.

c++ pimpl-idiom shared-ptr c++20

-1
推荐指数
1
解决办法
285
查看次数