LNK2001: 未解析的外部符号结构 **

LNK 2001: Unresolve external symbol struct **

#include "stdafx.h"
#include <ctype.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

//typedef struct kvNode kvNode;

struct kvNode
{
    char cKey[32];
    uint32_t iValue;
    struct kvNode *NEXT;
};

//Function declarations
void put(char *key[], int *value);
uint32_t get(char *key[]);
int del(char *key[]);
uint32_t hashkey(char *key);
void strUpper(char *);

const int arraylen = 10; //length of key array
kvNode *keys[]; //our key array

int main()
{
    //Create array of pointers to kvNodes
    keys[arraylen] = { NULL };
    return 0;
}

我很确定这是返回错误的代码块。错误发生在构建期间并且是:

1>keyValue.obj : error LNK2001: unresolved external symbol "struct kvNode * * keys" (?keys@@3PAPAUkvNode@@A)

我想做的是在 C 中练习键值存储(毫无疑问,使用更多,我们应该说,放松 语言最近让我的 C 刀变钝了),所以我定义了一个键值节点结构,然后是指向这些节点的指针数组。在 SO 上关于结构的前向声明的其他问题之后,我得到了声明指向结构内部结构的指针的语法,但由于某种原因,编译器 (Vis Studio) 正在对一个未解析的外部符号咳嗽,我不知道为什么。

您需要声明此数组的大小kvNode *keys[]; //our key array

如果编译时不知道大小,编译器怎么编译呢?它被声明为具有静态生命周期,因此必须为其指定固定大小,二进制文件中的固定内存块。我认为编译器将上面的行解释为声明而不是定义,因此 link 错误。

这是一个编译时问题,不是 link 时间问题。用这一行:

kvNode *keys[];

有几个问题。

首先,语法不正确:。应该是:

struct kvNode *keys[];

但这不会处理下一行,因为编译器将默认只使用单个项目大小的键[]

keys[arraylen] = { NULL };

建议:

struct kvNode *keys[ arraylen ];

即便如此,这一行:

keys[arraylen] = { NULL };

正在尝试设置将超过指针数组末尾的键[10]。因为在 C 中,数组索引从 0 而不是 1 开始,所以 keys[] 的有效索引是 0...9

强烈建议在编译时始终启用所有警告,然后修复这些警告。

强烈建议将编译步骤与 link 步骤分开执行,以便您可以轻松确定哪一步实际包含问题的根源