小编ana*_*lyg的帖子

来自void*的双指针和单指针?

我正在读一本关于在C中实现OOP的书,并找到了这段代码:

void delete (void * self)
{ 
    const struct Class ** cp = self;
    if (self && * cp && (* cp) -> dtor)
        self = (* cp) -> dtor(self);
    free(self);
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么作者创建了一个双指针而不是像这样的单个指针

void delete (void * self)
{ 
    const struct Class * cp = self;
    if (self && cp && cp -> dtor)
        self = cp -> dtor(self);
    free(self);
}
Run Code Online (Sandbox Code Playgroud)

有什么区别吗?

c pointers

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

如何设计下推式自动机

我如何设计一个接受平衡括号和括号的PDA([] []),我很难入门.我需要帮助编写此问题的转换函数.任何帮助表示赞赏

c++ pushdown-automaton

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

使用fgetc时,是否可以将EOF与正常的字节值混淆?

我们经常使用fgetc这样的:

int c;
while ((c = fgetc(file)) != EOF)
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

从理论上讲,如果文件中的某个字节的值为EOF,则此代码存在错误 - 它会提前中断循环并且无法处理整个文件.这种情况可能吗?

据我所知,fgetc内部将从文件读取的字节转换为unsigned char然后int返回,并返回它.如果范围int大于的范围,这将起作用unsigned char.

如果不是(可能那么sizeof(int)=1)会发生什么?

  • 有时会fgetc读取一个等于EOF文件的合法数据吗?
  • 它会改变从文件中读取的数据以避免单个值EOF吗?
  • fgetc是一个未实现的功能?
  • EOF是另一种类型long吗?

我可以通过额外的检查使我的代码变得简单:

int c;
for (;;)
{
    c = fgetc(file);
    if (feof(file))
        break;
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

如果我想要最大的便携性,这是必要的吗?

c binaryfiles language-lawyer fgetc

4
推荐指数
2
解决办法
459
查看次数

如何检查是否在Windows批处理脚本中定义了环境变量

我正在尝试创建一个批处理文件来检查环境变量是否已定义或未定义,如果是,则提供某个输出语句.这就是我所拥有的,我似乎无法让程序告诉我任何参数都已定义.

if not defined "%MyVar%" (
    echo MyVar is NOT defined
)

if defined "%MyVar%" (
    echo MyVar IS defined 
)
Run Code Online (Sandbox Code Playgroud)

windows batch-file environment-variables

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

在c ++中分配二维向量

#include<bits/stdc++.h>
using namespace std;
main()
{
    vector<vector<int> > v;
    for(int i = 0;i < 3;i++)
    {
        vector<int> temp;
        for(int j = 0;j < 3;j++)
        {
            temp.push_back(j);
        }
        //cout<<typeid(temp).name()<<endl;
        v[i].push_back(temp);
    }
 }
Run Code Online (Sandbox Code Playgroud)

我正在尝试分配一个二维向量.我收到以下错误

No matching function for call to 
std ::vector<int>::push_back(std::vector<int> &)
Run Code Online (Sandbox Code Playgroud)

c++ 2d-vector

4
推荐指数
3
解决办法
4026
查看次数

评估在编译时不满意?

如果我的代码包含此constexpr字符串

constexpr char my_str[] = "hello";
Run Code Online (Sandbox Code Playgroud)

my_str包含有关其大小的信息的类型,即sizeof(my_str)常量6,可以在需要常量的任何地方使用。

strlen(my_str)呢 是否可以/也应该将其评估为编译时常数?

这是yes的示例:https : //ideone.com/2U65bN

这是一个没有的示例:http : //coliru.stacked-crooked.com/a/8cb094776dfc5969

标准对此有何看法?当然不是“也许”吗?

c++ language-lawyer constexpr

4
推荐指数
2
解决办法
928
查看次数

为什么我没有看到 printf 缓冲区刷新?

我有一个简单的程序(工作示例):

#include <unistd.h>
#include <stdio.h>

int main() {
  pid_t my_pid = getpid();
  char str[30];

  sprintf(str, "/proc/%d/fd", my_pid);
  printf("hello, I am gonna print out: %s", str);

  execvp( "ls", (char *[]) { "ls", str, NULL } );

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

在 Linux VM 上用 gcc 编译。我的问题是为什么发送到的输出printf永远不会打印。

我知道printf缓冲其输出并且仅刷新\n. 我想知道为什么在这种情况下它不打印。我读到输出流在程序退出时被刷新。正在一块内存printf中缓冲输出(我在实现中确认了这一点)。malloc

我对此的疑问(欢迎更多详细信息):

  • 为什么注释掉调用会execvp导致输出打印在 上stdout,但它没有按原样打印?ls我的想法是,即使在蚕食进程之后,它是否仍然被认为是程序退出?
  • printf的内存缓冲区会被视为输出流吗?
  • 与这个问题完全不相关的细节是我想知道为什么我的进程不继承10文件描述符。zsh255bash

c printf stdout execvp output

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

构造函数Foo :: Foo接收对Foo的引用,但不接受对copy-constructor的引用

假设我有一个不可复制的Foo,其中一个构造函数恰好接收了对它的引用Foo.

class Foo
{
public:
    Foo(Foo& parent) {...}

private:
    void operator=(Foo); // disabled
    ...
};
Run Code Online (Sandbox Code Playgroud)

编译器认为这是一个复制构造函数,而它完成与复制完全无关的事情(因此禁用赋值运算符).

以这种方式定义构造函数是否存在任何危险,或者我应该人为地更改其签名,例如使用指针而不是引用,还是添加必需的伪参数?

这是一些背景(可能不需要理解/回答我的问题).

我有一个我自己编写的类库,它用作用户代码和另一个库之间的连接.另一个库提供了一个服务,我称之为frobnicate为简洁.用户代码可能如下所示:

class UsefulObject: public mylib::Frobnicator
{
    ...
    void DoStuff()
    {
        int x = ...
        ...
        frobnicate(x); // it's important to allow simple syntax here
        frobnicate(x + 1);
        ...
    }
    ...
};
Run Code Online (Sandbox Code Playgroud)

我想支持用户对象的层次结构:每个对象都包含在另一个(其父对象)中,而有一些(在我的情况下,5个)顶级对象包含其他所有对象.

每个对象都有一个日志文件; 我希望每个调用都记录在几个日志文件中,在包含层次结构中,直到顶级对象.

我用这种方式实现了它:

namespace mylib
{
    class Frobnicator // provides the frobnication service
    {
    public:
        Frobnicator(Frobnicator& parent): parent(parent) {}
    protected:
        virtual void …
Run Code Online (Sandbox Code Playgroud)

c++ copy-constructor chain-of-responsibility

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

指针的地址

为什么我们不能将指针的地址存储在另一个指针中?指针只是一个特殊类型的变量,它有一些地址,但为什么我不能将该地址存储到另一个指针?

int main()
{
    int * ptr;
    int * q;
    q = &ptr;
}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码错了?

c++ pointers

3
推荐指数
1
解决办法
80
查看次数

使用 Bazel 构建系统构建具有循环依赖的 C++ 代码

在我寻找一个可以处理多种语言并以增量方式构建代码的构建系统时,我发现 Bazel 是一个非常好的解决方案。然而,有一个问题我没有解决方案。

我有带有循环依赖关系的 C++ 代码。在问题解决之前,我需要一个可以构建此类代码的构建系统。我的问题是,Bazel 可以构建具有循环依赖的代码,尤其是 C++ 代码吗?如果是,有人可以分享指南或一些有用的链接吗?

c++ circular-dependency build-system bazel

3
推荐指数
1
解决办法
1717
查看次数