2

我遵循这本书,无法编译这个例子。有什么建议么?

  1 #define __STDC_WANT_LIB_EXT1__ 1
  2 #include <string.h>
  3 #include <stdio.h>
  4 
  5 
  6 int main(void)
  7 {
  8         char source[] = "Here we go...";
  9         char destination[50];
 10 
 11         if(strcpy_s(destination, sizeof(destination), source))
 12                 printf("An error occurred copying the string.n");
 13 
 14 
 15         return 0;
 16 }

错误:

/tmp/ccc5KZDZ.o: In function `main':
test.c:(.text+0x48): undefined reference to `strcpy_s'
collect2: error: ld returned 1 exit status
4

1 回答 1

6

strcpy_s()功能在 TR 24731-1 中定义(请参阅Do you use the TR 24731 'safe' functions),以及 ISO/IEC 9899:2011 的可选附件 K(C 2011 标准)。

您可以通过以下方式测试您的实现是否支持它:

__STDC_LIB_EXT1__整数常量 200509L,用于表示符合本技术报告。

(根据 TR)。附件 K 简单地说:

定义的实现__STDC_LIB_EXT1__应符合本附件中的规范。380)

380)未定义__STDC_LIB_EXT1__的实现不需要符合这些规范。

这个答案表明,C 2011 标准的 TC1(技术勘误 1)定义__STDC_LIB_EXT1__了附件 K 版本的函数应该是 201112L(2011 年 12 月)。我没有追踪附件 K 和 TR 24731-1 之间是否存在差异。

因此,您应该能够strcpy_s()通过 testing 测试您的库是否支持__STDC_LIB_EXT1__,但它是可选的。Ulrich Drepper 显然声明 GNU C 库不支持 TR 24731-1 函数;我不知道这是否仍然成立。

此外,请注意,其中某些功能的 Microsoft 接口不同于相同功能的标准接口(vsnprintf_s()例如 )。这限制了它们作为跨平台可移植工具的实用性。

于 2013-05-18T10:29:17.650 回答