C 定义的结构数组的元素在编译为 C++ 时具有不完整的类型
Posted
技术标签:
【中文标题】C 定义的结构数组的元素在编译为 C++ 时具有不完整的类型【英文标题】:elements of array of C-defined structures have incomplete type when compiled as C++ 【发布时间】:2017-11-24 21:26:24 【问题描述】:我正在尝试将 lua 嵌入到 C++ 程序中。在我尝试实现接口之前它运行良好。 通常,在某些时候会引入一个结构数组来将 lua 中的名称映射到 C 中定义的函数。 结构是typedef,是在lauxlib.h中完成的,是用C写的。我相信我的作品可以称得上是C++。
我需要这种类型的结构数组,以便将其传递给处理 C-Lua 交互的辅助函数。
如果可能,我希望将它们保留在单独的命名空间中。
我需要使用以下命令由 g++ 编译程序:
g++ -std=c++14 -static -fno-optimize-sibling-calls -fno-strict-aliasing -D_LINUX -lm -s -x c++ -O2 -Wall -Wtype-limits -Wno-unknown-pragmas -o $name $files
在编译过程中出现以下错误:
In file included from MyInterfaceWrappers.h:3:0,
from MyInterface.h:12,
from MyInterface.cpp:1: MyInterfacePlayer.h:32:2: error: elements of array ‘const MyInterfaceWrappers::luaL_reg
MyInterfaceWrappers::MyMetamethods []’ have incomplete type ;
这里是错误消息引用的文件的内容(它们被略微修剪,但它是消息指向的命名空间内的 const 结构):
extern "C"
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
static int getId (lua_State *L);
static int isMe (lua_State *L);
namespace MyInterfaceWrappers
const struct luaL_reg MyMetamethods [] =
"getId",getId,
"isMe",isMe,
NULL,NULL
;
;
如何解决这个问题?可以在不更改 C 源代码的情况下解决此问题吗?
【问题讨论】:
使用const struct luaL_reg
告诉编译器“类型是luaL_reg
,相信我是struct
”。省略 struct
会产生一个编译错误,表明该类型不存在,这将使您能够检测到拼写错误。
这不是一个“简单”的错字,而是一个系统性的错字,在从 C 到 C++ 的转换过程中很容易陷入其中。请保持打开状态。
@JensGustedt 拼写错误luaL_Reg
。我不会投票关闭这个拼写错误,因为除此之外这个问题还有很多意义。
【参考方案1】:
您将luaL_Reg
拼错为luaL_reg
。由于您使用了详细的类型说明符(struct luaL_reg
或等效的class luaL_reg
),就好像您为luaL_reg
类类型引入了声明。这种类型自然是不完整的。
所以修正拼写,不要使用详细的类型说明符,C++ 不会强迫你这样做。
【讨论】:
我撤回了我的评论,因为我错过了在我第一次阅读时通过详细的类型说明符指定你的意思的部分。 @FrançoisAndrieux - 实际上这是一个很好的评论。我觉得它仍然让我改进了答案 OP 显然来自 C,并且struct
是强制性的,除非你做一些特殊的 typedef
。所以这是两种语言不一致的地方的翻译错误。
@JensGustedt - 拼写错误的结构标记也会在 C 中导致相同类型的错误(或等效的错误,如果错误文本必须不同)。翻译不是错误的原因。它只是会给出一个不同的错误,这对 OP 来说可能会更清楚。以上是关于C 定义的结构数组的元素在编译为 C++ 时具有不完整的类型的主要内容,如果未能解决你的问题,请参考以下文章
C:“数组类型具有不完整的元素类型”当使用没有 typedef 的结构数组时
如何在编译为 WebAssembly 的 Rust 库中使用 C 库?
c struct queue error:“数组类型具有不完整的元素类型”