关于C#:对memcpy_s的未定义引用

Undefined reference to memcpy_s

我正在尝试修复对memcpy_s()错误的未定义引用。 我已经在文件中包含了string.h,并且memcpy()函数可以正常工作,并且我还尝试了包含memory.h。 我在x64 Windows 7上并使用gcc 4.8.1进行编译。

1
2
3
4
5
6
7
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void doMemCopy(char* buf, size_t buf_size, char* in, int chr) {
    memcpy_s(buf, buf_size, in, chr);
}

buf的内存已在调用doMemCpy(buf, 64, in, bytes)的主函数中分配。 in是从标准输入读取的字符串

来自cmd终端的确切错误:

undefined reference to"memcpy_s" collect2.exe: error: ld returned 1 exit status


据我所知,GCC 4.8不包含函数memcpy_s或任何其他_s边界检查函数。 这些功能在ISO 9899:2011附录K中定义,并且是可选的实现。 在使用它们之前,必须检查是否定义了__STDC_LIB_EXT1__

这些功能最初是由Microsoft实现的,许多团体都反对将它们包含在标准中。 我认为主要的反对意见是,由函数完成的错误处理涉及线程之间共享的全局回调句柄,但它们的效率也很低。

卡洛斯·奥多内尔(Carlos O'Donell)和马丁·塞博尔(Martin Sebor)可以从附件K中的最新实地经验—边界检查接口中获得更多阅读信息。


我从未使用过,但是AFAIK,您需要添加

1
#define __STDC_WANT_LIB_EXT1__ 1

之前

1
#include <string.h>

使用memcpy_s()