STDARG.3
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:3k
源码类别:

操作系统开发

开发平台:

C/C++

  1. ." @(#)varargs.3 6.3 (Berkeley) 5/15/86
  2. ."
  3. .TH STDARG 3  "May 15, 1986"
  4. .AT 3
  5. .SH NAME
  6. stdarg - variable argument list
  7. .SH SYNOPSIS
  8. .nf
  9. .ft B
  10. #include <stdarg.h>
  11. void va_start(va_list fIapfP, fIargtypeNfP fIparmNfP)
  12. fItypefP va_arg(va_list fIapfP, fItypefP)
  13. void va_end(va_list fIapfP)
  14. .ft R
  15. .fi
  16. .SH DESCRIPTION
  17. This set of macros provides a means of writing portable procedures that
  18. accept variable argument lists.
  19. Routines having variable argument lists (such as
  20. .BR printf (3))
  21. that do not use
  22. .B stdarg
  23. are inherently nonportable, since different
  24. machines use different argument passing conventions.
  25. .PP
  26. A function that accepts a variable argument list is declared with "..." at
  27. the end of its parameter list.  It must have at least one normal argument
  28. before the "...".  For example:
  29. .PP
  30. .RS
  31. .nf
  32. int printf(const char *format, ...) { /* code */ }
  33. int fprintf(FILE *stream, const char *format, ...) { /* code */ }
  34. .fi
  35. .RE
  36. .PP
  37. .B va_list
  38. is a type which is used for the variable
  39. .I ap
  40. within the body of a variable argument function which is used to traverse
  41. the list.
  42. .PP
  43. .B va_startc
  44. .RI ( ap ,
  45. .IR parmN )
  46. is called to initialize
  47. .I ap
  48. to the beginning of the list.  The last true parameter of the function,
  49. .IR parmN ,
  50. must be supplied to allow
  51. .B va_start
  52. to compute the address of the first variable parameter.
  53. .PP
  54. .B va_argc
  55. .RI ( ap ,
  56. .IR type )
  57. will return the next argument in the list pointed to by
  58. .IR ap .
  59. .I Type
  60. is the type to which the expected argument will be converted
  61. when passed as an argument.
  62. .PP
  63. Different types can be mixed, but it is up
  64. to the routine to know what type of argument is
  65. expected, since it cannot be determined at runtime.
  66. .PP
  67. .B va_endc
  68. .RI ( ap )
  69. must be used to finish up.
  70. .PP
  71. Multiple traversals, each bracketed by
  72. .B va_start
  73. &...
  74. .B va_end,
  75. are possible.
  76. .SH EXAMPLE
  77. .nf
  78. .ta +4n +4n +4n +4n
  79. fB#includefP <stdarg.h>
  80. .sp 0.4
  81. execl(fBconst charfP *path, fB...fP)
  82. {
  83. fBva_listfP ap;
  84. fBcharfP *args[100];
  85. fBintfP argno = 0;
  86. fBva_startfP(ap, path);
  87. fBwhilefP ((args[argno++] = fBva_argfP(ap, fBcharfP *)) != NULL) {}
  88. fBva_endfP(ap);
  89. fBreturnfP execv(path, args);
  90. }
  91. .DT
  92. .fi
  93. .SH NOTES
  94. It is up to the calling routine to determine how many arguments
  95. there are, since it is not possible to determine this from the
  96. stack frame.  For example,
  97. .B execl
  98. passes a null pointer to signal the end of the list.
  99. .B Printf
  100. can tell how many arguments are supposed to be there by the format.
  101. .PP
  102. The macros
  103. .B va_start
  104. and
  105. .B va_end
  106. may be arbitrarily complex;
  107. for example,
  108. .B va_start
  109. might contain an opening brace,
  110. which is closed by a matching brace in
  111. .BR va_end .
  112. Thus, they should only be used where they could
  113. be placed within a single complex statement.
  114. .SH BUGS
  115. It is impossible to properly show the macros as C declarations as is
  116. done in the synopsis.  They can never be coded as C functions, because
  117. all three macros use their arguments by address, and the
  118. .I type
  119. field is certainly impossible.
  120. Just look at them as being part of the C language, like
  121. .BR sizeof .