小编Wil*_*llW的帖子

为什么C不提供结构比较?

正如大多数C程序员所知,你无法直接比较两种结构.

考虑:

void isequal(MY_STRUCT a, MY_STRUCT b)
{
    if (a == b)
    {
        puts("equal");
    }
    else
    {
        puts("not equal");
    }
 }
Run Code Online (Sandbox Code Playgroud)

a==b比较将AFAIK扔在任何合理的C语言编译器编译错误,因为C标准不允许内置结构比较.使用memcmp的变通方法当然是一个坏主意,因为对齐,打包,位域等,所以我们最终逐个元素比较函数.

另一方面,它允许结构分配,例如a = b完全合法.很明显,编译器可以相当简单地处理这个问题,为什么不进行比较呢?

我唯一的想法是结构分配可能与memcpy()非常接近,因为对齐等因素无关紧要.另一方面,比较可能更复杂.或者这是我缺少的东西?

显然,我知道通过元素比较做一个简单的元素不一定足够,例如,如果结构包含指向字符串的指针,但在某些情况下它会有用.

c

14
推荐指数
5
解决办法
7307
查看次数

Dart 中确定调试或发布的方法之间的差异

我知道有两种方法可以确定我的应用程序是否在调试模式下运行:

const bool.fromEnvironment("dart.vm.product")如果释放则返回 true。

这来自 Flutter 文档的 Sentry 部分:

bool get isInDebugMode {
  // Assume we're in production mode
  bool inDebugMode = false;

  // Assert expressions are only evaluated during development. They are ignored
  // in production. Therefore, this code will only turn `inDebugMode` to true
  // in our development environments!
  assert(inDebugMode = true);

  return inDebugMode;
}
Run Code Online (Sandbox Code Playgroud)

这两者总是等价的还是在某些情况下他们会给出不同的答案?我应该使用哪个?第一种方法是编译时似乎更有利。

dart flutter

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

如何在 docker 镜像中应用 nix-shell 配置?

我正在尝试使用 Nix 作为统一我的本地开发环境和我正在使用的基于 docker 的 Gitlab CI 构建的一种方式。

我有一个完美的简单 shell.nix - 我可以在本地运行 nix-shell 并获得我需要的一切。

如果,在我的 CI 配置中,我将其nixos/nix:latest用作我的 docker 映像,并将所有命令nix-shell --run "xxx"都包含在内。这nix-shell所有的地方是繁琐的维护,难以阅读什么是真正回事。我想做的是将该配置作为第一个命令以某种方式应用于 docker 映像,以便该环境可用于所有后续构建命令。

我想我想要的是类似的东西,nix-env -f shell.nix -i但失败了,“这个派生不是为了构建,不是为了中止”。

提前致谢。

docker gitlab-ci nix

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

使用无限列表时执行速度较慢

我开始尝试让我的头围绕着哈斯克尔表演,以及让事情快速和缓慢的原因,我对此感到有些困惑.

我有一个函数的两个实现,它生成一个特定值的素数列表.第一个是直接关闭Haskell维基:

primesTo :: (Ord a, Num a, Enum a) => a -> [a]
primesTo m = eratos [2..m]  where
   eratos []     = []
   eratos (p:xs) = p : eratos (xs `minus` [p*p, p*p+p..m])
Run Code Online (Sandbox Code Playgroud)

第二个是相同的,但在内部使用无限列表:

primes2 :: (Ord a, Num a, Enum a) => a -> [a]
primes2 m = takeWhile (<= m) (eratos [2..])  where
   eratos []     = []
   eratos (p:xs) = p : eratos (xs `minus` [p*p, p*p+p..])
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,减函数是:

minus :: (Ord a) => [a] -> [a] -> …
Run Code Online (Sandbox Code Playgroud)

performance haskell

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

复制构造函数错误,没有明显的副本

我试图从头开始构建一些简单的日志记录功能,使用像"<<"接口这样的流,并且遇到了一些编译器问题.以下是我的代码的基础知识:

#include <string.h>
#include <sstream>
#include <iostream>

class Logger
{
public:
    class Buffer
    {
    public:
        Buffer(Logger &parent) : mPar(parent)
        {
        }

        ~Buffer(void)
        {
            mPar.endline(os);
        }

        template<class T>
        Buffer& operator<<(const T& x)
        {
            os << x;
            return *this;
        }

        Logger& mPar;
        std::ostringstream os;
    };

    Buffer write(void)
    {
        return Buffer(*this);
    }

    void endline(std::ostringstream& os)
    {
        std::cout << os.str() << std::endl;
    }
};

int main(int argc, char **argv)
{
    Logger log;

    log.write() << "fred" << 3 << "bob";
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

In file included …
Run Code Online (Sandbox Code Playgroud)

c++ iostream stringstream ostringstream

2
推荐指数
1
解决办法
1360
查看次数