小编dhe*_*ein的帖子

为什么C中需要语法"int(*)[*]"?

刚刚在ISO/IEC9899中找到了一些东西我偶然发现了这个:

6.7.6类型名称

[...]

语义

2在几种情况下,有必要指定一种类型.这是使用类型名称完成的,类型名称在语法上是函数的声明或省略标识符的该类型的对象.128)3示例构造

(a) int
(b) int *
(c) int *[3]
(d) int (*)[3]
(e) int (*)[*]
(f) int *()
(g) int (*)(void)
(h) int (*const [])(unsigned int, ...)
Run Code Online (Sandbox Code Playgroud)

name分别命名为(a)int,(b)指向int的指针,(c)指向int的三个指针的数组,(d)指向三个int的数组的指针,(e)指向未指定数字的可变长度数组的指针oft,(f)没有参数规范的函数返回指向int的指针,(g)指向函数的指针,没有返回int的参数,以及(h)指向函数的未指定数量的常量指针的数组,每个指针都有一个参数具有unsigned int类型和未指定数量的其他参数,返回int.

让我最困惑的是:

(e)指向未指定数量的整数的可变长度数组的指针

我可以或多或少地了解其他人.但是指向未指定数量的'整数'的VLA的指针有什么用?

甚至还需要编译器来支持语法

int foo[*];
Run Code Online (Sandbox Code Playgroud)

编辑澄清

本课题主要针对"是否有必要为编译器提供支持?".虽然这篇文章ANSI-C语法 - 像[*] et alii这样的数组声明明显提高了我的知识.仍然没有答案:为什么编译器需要知道原型的参数是否是包含未知大小的地址.只是简单地做int foo[]或者它将是未指定的大小?

那么真的有必要得到支持吗?如果不是这样,那为什么标准甚至会实现这种语义呢?

c c99

24
推荐指数
3
解决办法
2513
查看次数

是否在一个变量上使用sizeof,其中存在一个同名的类型?

这是明确定义的行为还是未定义/以其他方式定义哪些foo(数据类型或标识符)sizeof将在哪些操作?

typedef int foo;

int main(int argc, char *argv[])
{
    char foo;
    printf ("%u\r\n", sizeof(foo));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果它定义得很好,有没有办法可以获得数据类型的大小foo而不声明该类型的变量只sizeof在其上使用?

c sizeof undefined-behavior

13
推荐指数
3
解决办法
709
查看次数

是否存在else if语句?

前段时间没有站在这样的线路之后:

if (arg)
    invk(test);
else if (test)
{
    alot();
    stuff();
}
Run Code Online (Sandbox Code Playgroud)

我决定在1920x1200次中为自己提供更好的可读性,而不是省略{}.

所以我写了一个工具来重新格式化我现有的代码.

后来我注意到该工具中的一个错误

if (x)
{
 ...
}
else if(y)
{
 ...
}
else if(z)
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

已被改变(不明显地改变行为)成:

if (x)
{
 ...
}
else 
{
    if(y)
    {
     ...
    }
    else
    {
        if(z)
        {
         ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这让我意识到(无意)这实际上是else if通过C的语法和语义规则做的事情.

那么,有没有甚至像一个陈述else if()现有或只是语义的滥用的结果在这个有用的,但(让我们称之为它,以便用于此目的)混淆起源措辞,打破任何格式化规则,只是作为人类可读?

c if-statement language-lawyer semantics

12
推荐指数
1
解决办法
1636
查看次数

Qt图形视图,显示图像!,小工具

这是我的代码:

void MainWindow::on_actionOpen_Image_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath());

    if(!fileName.isEmpty())
    {
        QImage image(fileName);

        if(image.isNull())
        {
            QMessageBox::information(this,"Image Viewer","Error Displaying image");
            return;
        }

        QGraphicsScene scene;
        QGraphicsView view(&scene);
        QGraphicsPixmapItem item(QPixmap::fromImage(image));
        scene.addItem(&item);
        view.show();   
    }
Run Code Online (Sandbox Code Playgroud)

}

我想从文件显示图像,代码工作正常,但图像的速度非常快.

如何暂停图像屏幕?

如何在"graphicsView"小部件中加载图像?

我的代码:

void MainWindow::on_actionOpen_Image_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath());

    if(!fileName.isEmpty())
    {
        QImage image(fileName);

        if(image.isNull())
        {
            QMessageBox::information(this,"Image Viewer","Error Displaying image");
            return;
        }

        QGraphicsScene scene;
        QGraphicsPixmapItem item(QPixmap::fromImage(image));
        scene.addItem(&item);

        ui->graphicsView->setScene(&scene);
        ui->graphicsView->show();    
    }
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的.

如何解决这个问题?

graphics qt image view qgraphicsview

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

为什么vba中布尔值的大小是2字节?

在我的学徒生涯中,我们现在开始在学校学习 vba。当老师向我们分发数据类型摘要时,我有点困惑。……

布尔值 -> 2 字节 -> 范围:True / False

True/False当然是合理的,但是,为什么使用 2 个字节,因为布尔值必须能够表示 2 个值中的任何一个?我的意思是理论上我们可以使用单个位来表示该范围内的任何值。(但我知道这是没有意义的,因为我们使用的是高级语言)

当我问我的老师这个问题时,他表现得好像他从来没有问过自己同样的问题,经过几秒钟的沉思,他只是用这样的答案结束了这句话:“你必须接受它,因为它是什么,它是什么?”是。” 但如果我只是“使用”,并且永远不会对理解感兴趣,那么我不会称自己为优秀的程序员。所以我现在在这里问:

vba中是否有任何原因,为什么Boolean需要2个字节而不是单个字节?

vba types range

9
推荐指数
1
解决办法
1891
查看次数

使用sizeof运算符可以很好地定义此代码吗?

#include <stdio.h>

void test(int arr[]);

int main ()
{
    int *arr[3];
    int ar1[2] = { 1, 2 };
    int ar2[3] = { 3, 4, 5 };
    int vla[ar2[1]];
    arr[0] = ar1;
    arr[1] = ar2;
    arr[2] = vla;

    for  (int i = 0; i < 3; i++)
    {
        test(arr[i]);
    }
}

void test(int arr[])
{
    printf("%zu\r\n", sizeof(arr));
}
Run Code Online (Sandbox Code Playgroud)

正如标题所说:这是有效的吗?如果是这样,有没有办法test()通过使用sizeof像数组一样输入的函数参数来输出不同的值?

c arrays sizeof

9
推荐指数
2
解决办法
520
查看次数

单一来源项目结构有哪些缺点?

我是现在公司的新成员,正在研究由我的直接团队负责人撰写的项目.该公司通常不使用C++,但我的同事用C/C++编写了高效的代码.只有我们知道如何用C++编写代码(我和我的领导,所以没有第三种意见可以参与).

在我对项目有足够的了解之后,我意识到整个结构都是...... 特别的.

它实际上由一个编译单元组成,其中makefile列为唯一的源代码main.hpp.

然后,此头文件包含项目所包含的所有源文件,因此它看起来像一个非常大的列表:

#include "foo.cpp"
#include "bar.cpp"
Run Code Online (Sandbox Code Playgroud)

在尝试理解它背后的逻辑时,我意识到这确实适用于这个项目,因为它只是一个接口,每个单元可以在不访问任何其他单元的情况下运行,在某些时候我问他为什么这样做的原因是什么这条路.

我对这个论点采取了防御性的反应

嗯,它有效,不是吗?如果您认为对您更好,您可以自由地按照自己的方式行事.

这就是我现在正在做的事情,仅仅因为我在思考这个结构时遇到了麻烦.所以现在我将"通常"结构应用到我现在正在编写的实现中,同时只对整个项目进行必要的更改,以演示我将如何设计它.

我认为存在许多缺点,从混合链接器和编译器开始,通过自己的项目结构工作不能很好地服务,直到优化可能以冗余或模糊的结果结束,更不用说项目的干净构建需要大约30分钟,我认为可能也是由结构引起的.但我缺乏知名度的知识,而不仅仅是假设的问题.

而他的论点是"它按我的方式工作,不是吗?" 是的,我希望能够向他解释为什么这是一个坏主意,而不是作为新的挑剔的家伙过来.

那么这样的项目结构究竟会导致什么问题呢?或者我反应过度,这样的结构完全没问题?

c++ linker

9
推荐指数
1
解决办法
1952
查看次数

alloca的函数范围中的goto是否有效?

C标准禁止转入存在VLA的功能范围.

VLA和对alloca函数的调用应该在低级别上具有相同的结果.

(我可能是错的,因为我只是一个C,而不是一个低级程序员,但在我的想象中,似乎很机智)

那么下面的代码片段也会是未定义的行为吗?

int main()
{
    char *p;

    goto label1;

    {
        p = _alloca(1);
label1:
        p = NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然我不能参考p,但是关于这种行为是什么?

c c99 alloca undefined-behavior

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

sizeof没有()做什么?

当我问他什么时,这个问题的作者对我很开心 sizeof * q......他告诉我这是一个非常基本的C问题,我应该检查一下.但是当我环顾四周并且之前没有见过某人问过时,我现在就自己做了:

sizeof在没有括号和/或类型的情况下使用C时会做什么?

c sizeof

7
推荐指数
3
解决办法
1387
查看次数

在声明VLA的同一序列点中启动VLA的大小部分是否有效?

这篇文章中,OP包含有很多错误的代码,但是1行让我特别好奇,因为我无法查看任何东西,不允许它.这是具体的一行:

int n = 100000, arr[n];
Run Code Online (Sandbox Code Playgroud)

是否确保了声明和初始化的顺序?

所以在这里我会假设它甚至可能发生narr获得声明时没有被初始化,看起来很不好.

但是我无法在iso/iec 9899草案中找到任何关于此的陈述,既没有说明未定义也没有定义它.

这是因为我假设未定义的行为?或者是吗?

无论哪种方式,该结果适用的规则是什么?5

编辑:

这对C99也有效吗?

c sequence-points variable-length-array

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