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 ( TR 24731 'safe' functions を使用しますか? を参照) で定義されており、ISO/IEC 9899:2011 (C 2011 標準) のオプションの Annex K でも定義されています。

実装がそれをサポートしているかどうかは、次の方法でテストできます。

__STDC_LIB_EXT1__整数定数 200509L は、このテクニカル レポートへの準拠を示すことを目的としています。

(TRによると)。附属書 K は単に次のように述べています。

を定義する実装は__STDC_LIB_EXT1__、この附属書の仕様に準拠するものとします。380)

380)定義しない実装は__STDC_LIB_EXT1__、これらの仕様に準拠する必要はありません。

この回答は、C 2011 標準の TC1 (Technical Corrigenda 1)__STDC_LIB_EXT1__が、関数の Annex K バージョンの 201112L (2011 年 12 月) であるべきであることを定義していることを示しています。附属書 K と TR 24731-1 に違いがあるかどうかは追跡していません。

strcpy_s()そのため、テストによってライブラリがサポートしているかどうかをテストできるはずです__STDC_LIB_EXT1__が、これはオプションです。GNU C ライブラリは TR 24731-1 関数をサポートしないという Ulrich Drepper の声明があったようです。それが今も続いているかどうかはわかりません。

また、これらの関数の一部に対する Microsoft インターフェイスは、同じ関数 ( など) に対する標準インターフェイスとは異なることに注意してくださいvsnprintf_s()。これにより、クロスプラットフォームの移植性ツールとしての有用性が制限されます。

于 2013-05-18T10:29:17.650 に答える