⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macro1.c

📁 linux下的gcc编译器
💻 C
字号:
/* Copyright (C) 2000 Free Software Foundation, Inc.  *//* { dg-do run } *//* Tests various macro abuse is correctly expanded.  */extern int puts (const char *);extern void abort (void);extern int strcmp(const char *s1, const char *s2);#define err(str) do { puts(str); abort(); } while (0)#define j(x, y) x + y#define k(x, y) j(x + 2, y +#define glue(x, y) x ## y#define xglue(x, y) glue(x, y)/* Functions called when macros are left unexpanded.  */int q(int x)		{return x + 40;}int B(int x)		{return x + 20;}int foo(int x)		{return x + 10;}int bar(int x, int y)	{return x + y;}int baz(int x, int y)	{return x + y;}int toupper(int x)	{return x + 32;}int M(int x)		{return x * 2;}int main (int argc, char *argv[]){#define q(x) x  if (q(q)(2) != 42)    err ("q");#define A(x) B(x)  if (A(A(2)) != 42)    err ("A");#define E(x) A x#define F (22)  if (E(F) != 42)    err ("E(F)");#define COMMA ,#define NASTY(a) j(a 37)  if (NASTY (5 COMMA) != 42)    err ("NASTY");#define bar(x, y) foo(x(y, 0))#define apply(x, y) foo(x(y, 22))#define bam bar  if (bar(bar, 32) != 42)	/* foo(bar(32, 0)).  */    err ("bar bar");  if (bar(bam, 32) != 42)	/* Same.  */    err ("bar bam");  if (apply(bar, baz) != 42)	/* foo(foo(baz(22, 0))).  */    err ("apply bar baz");  /* Taken from glibc.  */#define __tobody(c, f) f (c)#define toupper(c) __tobody (c, toupper)  if (toupper (10) != 42)	/* toupper (10). */    err ("toupper");  /* This tests that M gets expanded the right no. of times.  Too many     times, and we get excess "2 +"s and the wrong sum.  Derived from     nested stpcpy in dggettext.c.  */#define M(x) 2 + M(x)#define stpcpy(a) M(a)  if (stpcpy (stpcpy (9)) != 42) /*  2 + M (2 + M (9)) */    err ("stpcpy");  /* Another test derived from nested stpcpy's of dggettext.c.  Uses     macro A(x) and function B(x) as defined above.  The problem was     the same - excess "1 +"s and the wrong sum.  */#define B(x) 1 + B(x)#define C(x) A(x)  if (C(B(0)) != 42)		/* 1 + B (1 + B (0)) */    err ("C");  /* More tests derived from gcc itself - the use of XEXP and COST.     These first two should both expand to the same thing.  */  {    int insn = 6, i = 2, b = 2;#define XEXP(RTX, N)  (RTX * N + 2)#define PATTERN(INSN) XEXP(INSN, 3)    if (XEXP (PATTERN (insn), i) != 42)	/* ((insn * 3 + 2) * i + 2) */      err ("XEXP (PATTERN)");    if (XEXP (XEXP (insn, 3), i) != 42)	/* ((insn * 3 + 2) * i + 2) */      err ("XEXP (XEXP)");#define COST(X) XEXP (XEXP (X, 4), 4)    if (COST (b) != 42)		/* ((b * 4 + 2) * 4 + 2) */      err ("COST");  }  /* This tests macro recursion and expand-after-paste.  */#define FORTYTWO "forty"#define TWO TWO "-two"  if (strcmp (glue(FORTY, TWO), "forty"))    err ("glue");  if (strcmp (xglue(FORTY, TWO), "forty-two"))    err ("xglue");  /* Test ability to call macro over multiple logical lines.  */  if (q      (42) != 42      || q (	 42) != 42      || q (42	    ) != 42      || q      (       42       )      != 42)    err ("q over multiple lines");  /* Corner case.  Test that macro expansion is turned off for later     q, when not at start but at end of argument context, and supplied     with the '(' necessary for expansion.  */  if (q(1 + q)(1) != 42)	/* 1 + q(1) */    err ("Nested q");  /* This looks like it has too many ')', but it hasn't.  */  if (k(1, 4) 35) != 42)    err ("k");  /* Phew! */  return 0;}

⌨️ 快捷键说明

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