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

med*_*dis 0 c reference undefined tr24731 strcpy

我按照这本书,无法编译这个例子.有什么建议?

  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 }
Run Code Online (Sandbox Code Playgroud)

错误:

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

Jon*_*ler 5

strcpy_s()功能在TR 24731-1中定义(参见您是否使用TR 24731'安全'功能),以及ISO/IEC 9899:2011(C 2011标准)的可选附件K中.

您可以使用以下命令测试您的实现是否支持它

__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()通过测试__STDC_LIB_EXT1__,但它是可选的.Ulrich Drepper的声明显然,GNU C Library不支持TR 24731-1功能; 我不知道这是否仍然存在.

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