8

我正在试验 XCode 并试图编译别人的 Windows 代码。

有这个:

inline GMVariable(const char* a) {
    unsigned int len = strlen(a);
    char *data = (char*)(malloc(len+13));
    if(data==NULL) {
    }
    // Apparently the first two bytes are the code page (0xfde9 = UTF8)
    // and the next two bytes are the number of bytes per character (1).
    // But it also works if you just set it to 0, apparently.
    // This is little-endian, so the two first bytes actually go last.
    *(unsigned int*)(data) = 0x0001fde9;
    // This is the reference count. I just set it to a high value
    // so GM doesn't try to free the memory.
    *(unsigned int*)(data+4) = 1000;
    // Finally, the length of the string.
    *(unsigned int*)(data+8) = len;
    memcpy(data+12, a, len+1);
    type = 1;
    real = 0.0;
    string = data+12;
    padding = 0;
}

这是在头文件中。

它呼唤我

使用未声明的标识符“malloc”

也适用于 strlen、memcpy 和 free。

这是怎么回事?抱歉,如果这非常简单,我是 C 和 C++ 的新手

4

2 回答 2

21

XCode 告诉您您正在使用称为 malloc 的东西,但它不知道 malloc 是什么。最好的方法是将以下内容添加到您的代码中:

#include <stdlib.h> // pulls in declaration of malloc, free
#include <string.h> // pulls in declaration for strlen.

在 C 和 C++ 中以 # 开头的行是预处理器的命令。在此示例中,命令 #include 提取另一个文件的完整内容。就好像您自己输入了 stdlib.h 的内容一样。如果右键单击#include 行并选择“转到定义”,XCode 将打开 stdlib.h。如果您通过 stdlib.h 搜索,您会发现:

void    *malloc(size_t);

它告诉编译器 malloc 是一个可以使用单个 size_t 参数调用的函数。

您可以使用“man”命令来查找要包含哪些头文件以用于其他功能。

于 2012-09-03T01:10:17.157 回答
7

在使用这些函数之前,您应该包含提供其原型的头文件。

对于 malloc & free 它是:

#include <stdlib.h>

对于 strlen 和 memcpy 它是:

#include <string.h>

您还提到了 C++。这些函数来自 C 标准库。要从 C++ 代码中使用它们,包含行将是:

#include <cstdlib>
#include <cstring>

但是,您很可能在 C++ 中做不同的事情,而不是使用这些。

于 2012-09-03T01:09:26.210 回答