LNK 2001:解析外部符号结构**

时间:2015-10-03 23:55:20

标签: c struct key-value key-value-coding

#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&gt; keyValue.obj:错误LNK2001:未解析的外部符号“struct kvNode * * keys”(?keys @@ 3PAPAUkvNode @@ A)

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

2 个答案:

答案 0 :(得分:2)

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

如果在编译时未知大小,编译器如何编译它?它被声明具有静态生命周期,因此必须给它一个固定的大小,一个固定的内存块在你的二进制文件中。我认为编译器将上面的行解释为声明而不是定义,因此链接错误。

答案 1 :(得分:0)

这是编译时问题,而不是链接时间问题。用这一行:

kvNode *keys[];

有几个问题。

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

struct kvNode *keys[];

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

keys[arraylen] = { NULL };

建议:

struct kvNode *keys[ arraylen ];

即便如此,这一行:

keys[arraylen] = { NULL };

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

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

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