- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 gcc 4.3 时遇到了一个奇怪的问题,我想知道这是编译器的特定问题还是一般的 C 问题。诚然,我使用了一个非常奇怪的结构,但我喜欢它,因为它允许我执行一些否则不可能实现的规则。该项目分为几个模块,每个模块都有一个不透明的结构。有一个typedef struct <tag> <type>
在 header 和 1 个 c 文件中声明,有一个 struct tag { ... };
所有函数都通过 <type> *
引用一个元素.
每个模块都知道自己的结构,其他模块的结构是不可见的。在一个模块中,我不使用 1 个元素,而是使用固定的元素数组。这意味着该模块的某些函数使用指向数组的指针。我们称该模块为wdi
.所以我有例如
void write_all(wdi_type (*wdis)[MAX_WDI]);
分配(我知道非常不寻常的语法)直接返回指向数组的右指针。
wdi_type (*wdi_alloc(void))[MAX_WDI];
这在 GNU-C 3.4.6 (Solaris SPARC) 下运行良好,在 cc 下,它还编译了 sun 编译器 v12(虽然无法测试它,因为应用程序的另一部分中断了)。但是在 gcc 4.3.3 上(也在 4.4.6 x86-64 和 4.6.2 ARM 上测试过),它没有。我收到编译错误 array type has incomplete element type
.我不明白为什么编译器会在那个阶段需要这些信息。它也不需要其他不透明结构的大小。
这是 gcc 错误吗?
标准是怎么说的?
我找不到相关信息。我应该向 GNU 提交错误报告吗?
最佳答案
标准(嗯,C2011标准的N1570草案)说,在6.2.5 (20)
An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type. The element type shall be complete whenever the array type is specified.
(我强调的)
C99 标准中的相应段落不那么有力:
An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type.36)
36) Since object types do not include incomplete types, an array of incomplete type cannot be constructed.
它没有明确禁止为不完整的元素类型指定数组类型,只是构造这样一个数组。
脚注 36 被强调句替换的时间和原因我一直没能查到,但那是在 November 2010 之前。 .
貌似gcc-4.x拒绝了基于新版本的代码,而gcc-3.4.6基于旧版本接受了,所以我认为不是bug,代码是根据当前标准明确无效。
关于c - 指向不透明结构数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15907456/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!