视觉工作室2015中的安全function

在Windows下对Visual C编码时,我发现自己被迫修改了我的代码,因为已弃用的函数,添加了第二个参数,当然还有使用安全函数(例如以_s结尾)。

我想知道,这些函数是否存在于C标准库中,如果我将它们传输到我的linux分区,我能用C编译器编译它们吗?

当我写一个关于偏移函数的字符串翻转时,我的担忧出现了:

#include  #include  #include  char *flipstr(char *str, size_t size, size_t offset); int main(int , char **) { char str[] = "JonSon"; char *p = flipstr(str, sizeof(str), 3); if (p) { printf("%s\n", p); } return 0; } char *flipstr(char *str, size_t size, size_t offset) { if (offset > strlen(str)) { return NULL; } char *tmp = (char *)calloc(size, sizeof(char)); strncpy_s(tmp, size, str, offset); memmove(str, str + offset, strlen(str + offset)); memcpy(str + strlen(str + offset), tmp, strlen(tmp)); free(tmp); return str; } 

不,大多数都不是标准的,你不应该只是因为微软的某个人决定“弃用”标准库的一半而不是非标准扩展。 当然,他们所做的事情有一些理由,但最终它简直荒谬。 您最好禁用警告并编写可移植的C / C ++。

这里有几个问题……

首先, 使用strcpy没有任何问题 ,这是一个神话。 它并没有被弃用,那只是微软gaga。

其次, strncpy从未打算成为strcpy的安全版本 。 它从来没有打算用于古代Unix中的旧的非标准字符串格式。

第三, strncpy是不安全和危险的。 看到这个和这个 。 有很多博客可以找到。

所以忘记strncpy ,因此,也忘了strncpy_s 。 实际上在C11边界检查接口中有一个名为strncpy_s的函数(对于编译器来说,这不是强制实现的)。

如果这个C11标准function与同名的非标准Microsoft垃圾函数完全兼容,我不知道。 我不会指望它。 但是,由于Visual Studio 2015是一个90年代早期的古老编译器,所以无论如何都不能使用C11。