我按照这本书编写了这个例子。有什么建议吗?
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
答案 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()
)不同。这限制了它们作为跨平台可移植性工具的实用性。