是否需要使用完整的类型?
有一个完整的类型需要一个lvalue吗?如果否,那么*x x有一个不完整的类型有效吗? 注意:对于" 可修改的LVALUE是一个没有数组类型的LVALUE,没有不完整的类型,... 此代码: struct s* x; void f(void) { *x; } 导致(主要是)错误: $ gcc -c -std=c11 -pedantic -Wall -Wextra :4:9: error: invalid use of undefined type 'struct x' $ clang -c -std=c11 -pedantic -Wall -Wextra :4:2: error: incomplete type 'struct x' where a complete type is required $ icc -c -std=c11 -pedantic -Wall -Wextra (4): e
10 2024-04-10
编程技术问答社区
"参数的类型不完整 "警告
我在c文件中有一个: struct T { int foo; }; c文件包含一个包含这些行的h文件: typedef struct T T; void listInsertFirst(T data, int key, LinkedList* ListToInsertTo); 功能listInsertFirst是我要警告的函数.我该如何修复? 解决方案 正如我们在评论中发现的那样,问题是struct T的定义发生在标题中T的定义之后.您确实在这里倒退了.标题应定义所有类型和功能原型,并且您的C文件应使用它们. 您想做的是更改插入功能的签名,以接收指向数据和数据大小的指针.然后,您可以为数据分配一些内存,复制并存储它.您不需要特定类型,只需声明void *. void listInsertFirst(void *data, size_t data_size, int key, LinkedList* ListToInsertTo); 然后
0 2024-04-08
编程技术问答社区
C: 对一个不完整类型的数组进行下标是否合法?
我找不到标准中的相关位,但是GCC和Clang允许它,所以我想我想知道它是编译器扩展名还是语言的一部分.如果可以的话,请提供链接. 这可能会出现诸如此类的事情: extern char arr[]; func(arr[7]); /*No error.*/ 晚期编辑:我认为我最好对此有一个清晰的了解,尽管我继续前进,但我从未做过,所以我将奖励我授予第一个人,以给我一个清晰,简洁的参考( es)在C89标准中,有关为什么允许这样做.如果没有人能在C89中找到答案,则可以接受C99,但是您需要先查看C89标准. 解决方案 以下语句 extern char arr[]; 是具有外部链接的声明,并说arr具有char>的类型,这意味着arr可能具有不完整的类型. 根据" 6.7声明"(N1570): 7如果对对象的标识符没有链接声明,则该对象的类型应为 在其宣言结束时完成,或者在其初始化仪的结束时完成 初始化器;对于功能参数(包括原型),它是调整后的
0 2024-04-08
编程技术问答社区
关于形式参数中C结构数组的一个错误
我有以下代码: struct student_info; void paiming1(struct student_info student[]); struct student_info { int num; char name[6]; }; IDE给出了一个错误 error: array type has incomplete element type ‘struct student_info’ void paiming1(struct student_info student[]); 但是,如果我使用void paiming1(struct student_info *student);它可以正常工作.这是为什么?我正在使用GCC. 解决方案 语言无条件地需要中的数组元素类型所有数组声明 已完成.时期. 6.7.6.2阵列声明器 约束 1 [...]元素类型不是不完整或功能 类型. [...] 对于函数参数列表
0 2024-04-08
编程技术问答社区
所有的结构标识符都是自动向前声明的
回答警告:与不相同的Pointer Pointer Type转让:对于链接列表阵列,我注意到任何未宣布的标识符被struct关键字被视为向前声明的标识符. 例如,下面的程序编译好: /* Compile with "gcc -std=c99 -W -Wall -O2 -pedantic %" */ #include struct foo { struct bar *next; /* Linked list */ }; int main(void) { struct bar *a = 0; struct baz *b = 0; struct foo c = {0}; printf("bar -> %p\n", (void *)a); printf("baz -> %p\n", (void *)b); printf("foo -> %p, %zu\n", (void *)&c, sizeof
2 2024-04-08
编程技术问答社区
我如何在MISRAC:2012中创建一个遵循4.12和4.8指令的模块?
这个问题与Misrac之后的ISO C99中的编码有关:2012指南. 我正在寻找DIR 4.8的指导.使用". 在C中实现抽象数据类型时,通常使用一个指针指向描述ADT内部状态的结构的指针.这可以使用不透明的指针根据DIR 4.8进行,其好处是内部细节仍然对用户隐藏. 通常可能存在这些ADT中的多个,因此必须有一种创建Mulitple手柄的方法.可以通过为手柄在初始化函数中引用的内部详细信息分配内存来解决这,但是,在DIR 4.12中不允许这样做. . 另一个选择是初始化例程接收指向用户提供的静态分配的手柄的指针,但是,这不能使用不透明的指针来完成. 我说明了下面的问题. Module.h struct module; typedef struct module module_t; /* Module handle is only available to the world as an incomplete type.
0 2024-04-07
编程技术问答社区
为什么符合要求的实现对具有内部联系的不完整数组类型有不同的表现?
示例代码(T0.C): static int arr[ ]; int main( void ) { return arr[ 0 ]; } static int arr[ ] = { 0 }; 调用: $ gcc t0.c -std=c11 -Wall -Wextra $ clang t0.c -std=c11 -Wall -Wextra $ cl t0.c /std:c11 /Za t0.c(1): error C2133: 'arr': unknown size $ gcc t0.c -std=c11 -Wall -Wextra -pedantic t0.c:1:12: error: array size missing in ‘arr’ $ clang t0.c -std=c11 -Wall -Wextra -pedantic C11,6.2.5类型,22: 未知大小的数
0 2024-04-07
编程技术问答社区
一个指向不完整类型的指针可以不完整吗?
int (*)[]是不完整的类型? c 2018 6.2.5 1说: 在翻译单元中的各个点上,对象类型可能是不完整的(缺乏足够的信息来确定该类型的对象的大小)或 complete (具有足够的信息). 因此,如果已知类型的大小,则该类型已完成. 6.2.6.1 28指定某些类型的指针必须具有相同的尺寸(指示void和字符,指向兼容类型的指针,结构的指针以及工会的指针),但是其他类型的指针可能会有所不同. 在C实现中,所有指针或所有指针int的大小都相同,然后知道int (*)[]的大小,因此已完成.在实现的实现中,例如使用不同的指针用于大型数组,大小是不知道的,因此不完整. AS 解决方案 一个未知大小的数组不完整: 未知大小的数组类型是不完整的类型.对于该类型的标识符,它通过在后来的声明中指定大小(带有内部或外部链接)来完成. . 类型int (*)[]但是不是不完整的:它是一个int数组的指针. 指针具有众所周知的尺寸: prin
0 2024-04-07
编程技术问答社区
在C语言中,创建一个不完整类型的lvalue在语义上是否可能?
在C89标准中,我找到了以下部分: 3.2.2.1 lvalues和功能指示符 除非是尺寸运算符的操作数,单位和操作员,++操作员, - 操作员或左操作数.运算符或分配操作员,没有数组类型的LVALUE转换为存储在指定对象中的值(并且不再是lvalue).如果LVALUE具有合格类型,则该值具有LVALUE类型的不合格版本;否则该值具有lvalue的类型. 如果LVALUE具有不完整的类型并且没有数组类型,则该行为是未定义的. 如果我正确阅读了它,它允许我们创建lvalue并在其上应用一些操作员,该操作员在运行时会编译并可能导致不确定的行为. 问题是,我无法想到一个可以通过编译器的语义检查和触发undefined behavior的"具有不完整类型的LVALUE"的示例. 认为lvalue是 an lvalue 是指定对象的表达式(具有对象类型或void以外的不完整类型). ,那不完整的类型是 类型分为对象类型(描述对象类型),功能类型(描
0 2024-04-07
编程技术问答社区
C++中的数据隐藏
我在C中有一些代码,该代码使用不完整的结构(简化示例): somings.h struct something; struct something *new_something(); int work_a(struct something *something); int work_b(struct something *something, const char *str); void free_something(struct something *something); somecode.c int some_function() { struct something *something; int x; something = new_something(); x = work_a(something); free_something(something); return x; } 我在想,我基本上是在
4 2024-04-07
编程技术问答社区
不完整数组类型的p[0]和*p的等效性
考虑以下代码(由于出现了此讨论): ) #include void foo(int (*p)[]) { // Argument has incomplete array type printf("%d\n", (*p)[1]); printf("%d\n", p[0][1]); // Line 5 } int main(void) { int a[] = { 5, 6, 7 }; foo(&a); // Line 10 } gcc 4.3.4 抱怨带有错误消息: prog.c: In function ‘foo’: prog.c:5: error: invalid use of array with unspecified bounds 在GCC 4.1.2中相同的错误消息,并且似乎是-std=c99,-Wall,-Wextra的不变性消息. . 因
0 2024-04-06
编程技术问答社区
C类型定义-不完整的类型
因此,从蓝色中,编译器决定面对面吐出来: "现场客户的类型不完整". 这是代码的相关片段: customer.c #include #include #include "customer.h" struct CustomerStruct; typedef struct CustomerStruct { char id[8]; char name[30]; char surname[30]; char address[100]; } Customer ; /* Functions that deal with this struct here */ customer.h 客户的标头文件.H #include #include #ifndef CUSTOMER_H #define CUSTOMER_H typedef st
0 2024-04-06
编程技术问答社区
GCC。数组类型有不完整的元素类型
我已经声明了一个struct,然后尝试将这些结构的数组(以及double double的数组和整数)传递到一个函数中.我收到一个"数组类型具有不完整的元素类型" 从GCC进行编译时.我如何将struct传递给功能有什么问题? typedef struct graph_node { int X; int Y; int active; } g_node; void print_graph(g_node graph_node[], double weight[][], int nodes); 我也尝试了struct g_node graph_node[],但是我得到了同样的东西. 解决方案 这是造成麻烦的数组: void print_graph(g_node graph_node[], double weight[][], int nodes); 必须给出第二个和后续维度: void print_graph(g_node graph_node[]
6 2024-04-06
编程技术问答社区
在模板类中使用auto的类不完整
以下代码形成良好? class B; template class A { B do_f() const; friend auto f(A const& a) {return a.do_f();} // #1 }; class B{}; template B A::do_f() const { return B{};} int main() { A a; f(a); } 如果我更改auto B B,我收到了不完整的类型错误消息. 用编译gcc/clang demo demo B demo 解决方案 在函数定义的上下文中,函数定义的参数类型或函数定义的返回类型不得是不完整或抽象的(可能是CV符合条件)类型,除非删除函数([dcl.fct.def.delete]). 但 在声明类型中具有占位符的函数模板的返回类型扣除,即使定义是在函数主体包含return语
2 2024-03-20
编程技术问答社区
int arr[ ] 是有效的C++吗?
我试图了解写作int arr[];在C ++中是否有效.因此以: int a[]; //is this valid? extern int b[];//is this valid? int (*ptrB)[]; //is this valid? struct Name { int k[]; //is this valid? }; void func() { ptrB++; //is this valid? } int a[10]; int b[10]; void bar() { ptrB = &b;//is this valid? ptrB++; //is this valid? } int main() { int c[];//is this valid? extern int d[]; //is this valid? } int c[10]; int d[10]; 我已经阅读了一些评论,以表明int p[];不是有效的C
0 2024-03-04
编程技术问答社区
不兼容的类型List of List和ArrayList of ArrayList
下行给我错误: Incompatible Types. List> output = new ArrayList>(); 原因是什么? 编辑 我明白如果我将第二个Arraylist更改为列表,则不会给我错误.我想知道错误的原因.谢谢 解决方案 如果您有List>,则可以向其添加LinkedList.但是您不能为ArrayList>>做到这一点,因此后者不可能是List>的一种. 其他解决方案 正确的写作应该是: List> ret = new ArrayList>(); 因为这样,您不仅可以添加ArrayList,还可以添加LinkedList到ret 其他解决方案 来自 generics,selentitan
10 2024-03-04
编程技术问答社区
不兼容的片段类型
嗨,我在Android中有小应用程序,其中IM使用带有导航抽屉的片段进行菜单.但是现在,当用户单击某些内容时,我想在我的片段对话框窗口中显示出来,我会得到以下错误: 主动脉: private void displayView(int position) { // update the main content by replacing fragments Fragment fragment = null; switch (position) { case 0: fragment = new HomeFragment(); break; case 1: fragment = new FindPeopleFragment(); break; default: break; }
2 2024-02-14
编程技术问答社区
我如何修复我的STL风格的容器,以容纳不完整或抽象的类型?
几天前,我自己尝试以与STL容器相同的样式编写基本的树实现.现在,我试图在我的代码中使用它,但是似乎有两件事与A std::vector相关.即,使用不完整的类型并使用抽象类型. 如何修复树的实现以获得此功能?我试图将我的代码浓缩一点,以向您展示相关部分. test.cpp #include "util/tree.hpp" #include struct IncompleteType; class AbstractType { public: virtual void do_something() = 0; }; class Test { public: Test() = default; private: tree incompleteTree; std::vector incompleteVector; tree
10 2024-01-09
编程技术问答社区
为什么一个不完整的类型不能被投到void中?
为什么以下代码给出以下错误? 为什么需要完成类型才能将其施放为void? struct Incomplete; class Class { virtual void foo(Incomplete &incomplete) { (void) incomplete; throw std::logic_error("not implemented"); } }; 错误: error C2027: use of undefined type 'Incomplete' see declaration of 'Incomplete' 解决方案 这是C和C ++之间的更改,Microsoft先前实施了C规则.如Remyabel的答案所述,此后已修复. 在c中,呈现为void的past,或者简单地将表达式作为语句本身(如incomplete;中)仍然涉及lvalue-to-rvalue转换. C称其为略
4 2023-11-25
编程技术问答社区
编译器能否将隐式声明的虚析构函数的实现放在单个单独的翻译单元中?
以下代码与Visual Studio(/permissive->>>>>>> c1>)编译和链接,但不使用gcc或clang. 编译. foo.h #include struct Base { virtual ~Base() = default; // (1) }; struct Foo : public Base { Foo(); // (2) struct Bar; std::unique_ptr bar_; }; foo.cpp #include "foo.h" struct Foo::Bar {}; // (3) Foo::Foo() = default; main.cpp #include "foo.h" int main() { auto foo = std::make_unique(); }
12 2023-11-20
编程技术问答社区