1

_name 形式的同义词存在于未在其名称前加上前导下划线列出的名称条目中。例如,libc 包含 getopt 和 _getopt。

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 包含同义词?

更新

如何使用同义词?我尝试替换getopt_getopt但只是为了得到undefined reference to_getopt'`

4

3 回答 3

0

可能是因为它们本来是非标准的,后来加入到POSIX中,去掉了前缀,但需要向后兼容,并被保留下来,自然就需要同义词。

于 2011-07-12T16:52:48.887 回答
0

或者可能(遵循@rubenvb 的答案,我认为这是正确的)以保持与一些如此命名的 Win32 库函数的源代码级兼容性。_toupper 就是其中之一。

于 2011-07-12T16:59:56.760 回答
0

引自“SYSTEM V APPLICATION BINARY INTERFACE”

C 库包括其某些服务的同义词。这些其他符号可用于符合语言和系统标准。例如,System Vread定义为操作系统工具的名称。另一方面,ANSI C 没有定义read,并且它禁止严格遵守的实现盗用没有前导下划线 (_) 的应用程序名称。因此,如果同义词read不可用,则系统不能支持严格符合 ANSI C 语言的实现。

注意:虽然以下接口不需要同义词,但允许它们存在。

简而言之,同义词是为了符合 ANSI C 建议。如果您使用 Linux,ELF 格式文档中的某些具有同义词的函数似乎在 中没有同义词glibc,因此您可能需要检查是否存在带有readelf -s /usr/lib/libc.a.

于 2012-03-01T16:21:16.150 回答