2011-07-12 3 views
1

名前の先頭にアンダースコアの先頭に という名前のエントリがない場合は、_nameという形式の同義語が存在します。したがって、libcには、例えば、getoptと_getoptの両方が入っています( )。なぜlibcに同義語が含まれているのですか?

Figure 3-2: libc Contents, Names with Synonyms 

    __assert  getdate  lockf **  sleep  tell ** 
    cfgetispeed getopt  lsearch  strdup  tempnam 
    cfgetospeed getpass  memccpy  swab   tfind 
    cfsetispeed getsubopt mkfifo  tcdrain  toascii 
    cfsetospeed getw   mktemp  tcflow  _tolower 
    ctermid  hcreate  monitor  tcflush  tsearch 
    cuserid  hdestroy  nftw   tcgetattr _toupper 
    dup2   hsearch  nl_langinfo tcgetpgrp twalk 
    fdopen  isascii  pclose  tcgetsid  tzset 
    __filbuf  isatty  popen  tcsendbreak _xftw 
    fileno  isnan  putenv  tcsetattr  
    __flsbuf  isnand ** putw   tcsetpgrp  
    fmtmsg ** lfind  setlabel  tdelete  

libcのは、同義語が含まれているのはなぜ?シノニムを使用する方法

UPDATE

?私は、このように自然に同義語があったが、_getoptgetoptを交換しようとしたが、彼らはもともと非標準であったためだけおそらくundefined reference to _getopt'`

答えて

0

を取得するには、後POSIXに追加し、接頭辞を削除しますが、必要な後方互換性、および維持しました必要です。

+0

シノニムの使用方法は? –

+0

@Je Rog:「普通の」名前がどこにでもあると思う。ヘッダーを確認してくださいが、単純な '#defined'が使われていると思います。 – rubenvb

+0

同義語はlibcに存在し、マクロ/プリプロセッサとは関係ありません。 –

0

また、そういう名前のWin32ライブラリ関数のソースレベルの互換性を維持するために(おそらく、@ rubenvbの答えに従うのが正しいと思いますが) _toupperはこれらの1つです。

0

引用 "SYSTEM Vアプリケーションバイナリインタフェース、"

Cライブラリには、そのサービスの一部の同義語を含んでいます。これらの他の記号は、言語およびシステム標準に準拠するために使用できます。一例として、System Vはオペレーティングシステム機能の名前としてreadを定義しています。一方、ANSI Cはreadを定義しておらず、厳密に準拠した実装では先頭にアンダースコア(_)を付けずにアプリケーション名を奪取することを禁じています。したがって、readの同義語が利用できなかった場合、システムはANSI C言語の厳密に準拠した実装をサポートできませんでした。

注:以下のインターフェイスでは、シノニムは必須ではありませんが、存在することは許可されています。

簡潔に言えば、同義語はANSI C勧告に準拠するためのものです。 Linuxを使用している場合、ELF形式の文書で同義語を持つ関数の一部はglibcに同義語がないようですので、記号の存在をreadelf -s /usr/lib/libc.aで確認するとよいでしょう。

関連する問題