func-vararg-alternate.h

来自「用于进行gcc测试」· C头文件 代码 · 共 151 行

H
151
字号
/* Simple test of vararg passing for problematic types with and without   double values passed between them.  */#include <stdarg.h>#ifdef DBG#include <stdio.h>#endifextern void abort (void);int failcnt;DTYPE a[10];double b[10];union U {  DTYPE d;  unsigned int i[INTS];};voidcompare (double r, double s, int *p, int *q, int n, int line){  int i;  for (i = 0; i < n; i++)    if (r != s || p[i] != q[i])#ifdef DBG      {	int j;	printf ("line %-3d", line);	for (j = 0; j < n; j++)	  printf ("  %08x", p[j]);	printf ("    %10.2g\n        ", r);	for (j = 0; j < n; j++)	  printf ("  %08x", q[j]);	printf ("    %10.2g\n\n", s);	    	return;      }#else      abort ();#endif}voidbar0 (int n, ...){  union U u;  int j;  va_list ap;  va_start (ap, n);  for (j = 0; j < n; j++)    a[j] = va_arg (ap, DTYPE);  va_end (ap);}voidbar1 (int n, ...){  union U u;  int j;  va_list ap;  va_start (ap, n);  for (j = 0; j < n; j++)    {      a[j] = va_arg (ap, DTYPE);      b[j] = va_arg (ap, double);    }  va_end (ap);}voidbar2 (int n, ...){  union U u;  int j;  va_list ap;  va_start (ap, n);  for (j = 0; j < n; j++)    {      b[j] = va_arg (ap, double);      a[j] = va_arg (ap, DTYPE);    }  va_end (ap);}voiddoit (){  DTYPE x, y, z;  union U u1, u2;  /* Sanity check that test setup is right, especially for long double     which can be changed by command line option.  */  if (INTS * 4 != sizeof (DTYPE))    {#ifdef DBG      printf ("test error: INTS = %d, sizeof (DTYPE) =  %d\n",	      INTS, sizeof (DTYPE));#endif      abort ();    }  x = ONE / THREE;  y = ONE / SEVEN;  z = ONE / ELEVEN;  bar0 (1, x);  u1.d = x; u2.d = a[0]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);  bar0 (2, x, y);  u1.d = x; u2.d = a[0]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);  u1.d = y; u2.d = a[1]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);  bar0 (3, x, y, z);  u1.d = x; u2.d = a[0]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);  u1.d = y; u2.d = a[1]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);  u1.d = z; u2.d = a[2]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);  bar1 (1, x, 1.5);  u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);  bar1 (2, x, 1.5, y, 2.5);  u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);  u1.d = y; u2.d = a[1]; compare (2.5, b[1], u1.i, u2.i, INTS, __LINE__);  bar1 (3, x, 1.5, y, 2.5, z, 3.5);  u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);  u1.d = y; u2.d = a[1]; compare (2.5, b[1], u1.i, u2.i, INTS, __LINE__);  u1.d = z; u2.d = a[2]; compare (3.5, b[2], u1.i, u2.i, INTS, __LINE__);  bar2 (1, 1.5, x);  u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);  bar2 (2, 1.5, x, 2.5, y);  u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);  u1.d = y; u2.d = a[1]; compare (2.5, b[1], u1.i, u2.i, INTS, __LINE__);  bar2 (3, 1.5, x, 2.5, y, 3.5, z);  u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);  u1.d = y; u2.d = a[1]; compare (2.5, b[1], u1.i, u2.i, INTS, __LINE__);  u1.d = z; u2.d = a[2]; compare (3.5, b[2], u1.i, u2.i, INTS, __LINE__);  if (failcnt != 0)    abort ();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?