未明确引用`strcpy_s'无法编译

时间:2013-05-18 10:12:11

标签: c reference undefined strcpy tr24731

我按照这本书编写了这个例子。有什么建议吗?

  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

1 个答案:

答案 0 :(得分:5)

strcpy_s()函数在TR 24731-1中定义(参见Do you use the TR 24731 'safe' functions),也在ISO / IEC 9899:2011(C 2011标准)的可选附件K中定义。

您可以使用以下方法测试您的实现是否支持它:

  

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

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

  

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

     

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

answer表示C 2011标准的TC1(技术勘误1)定义了__STDC_LIB_EXT1__应为201112L(2011年12月),用于附件K版本的功能。我没有跟踪附件K和TR 24731-1之间是否存在差异。

因此,您应该可以通过测试strcpy_s()来测试您的库是否支持__STDC_LIB_EXT1__,但它是可选的。 Ulrich Drepper的声明显然,GNU C Library不支持TR 24731-1功能;我不知道这是否仍然存在。

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