📄 enquire.c
字号:
(long) char_min, (long) maxint, (long) CHAR_MIN, ""); if (c_signed) { i_define(D_SCHAR_MAX, "", "SCHAR", "_MAX", (long) char_max, 0L, (long) SCHAR_MAX, ""); i_define(D_SCHAR_MIN, "", "SCHAR", "_MIN", (long) char_min, (long) maxint, (long) SCHAR_MIN, ""); } else { if (sizeof(char) == sizeof(int)) { u_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", (long) char_max, (long) UCHAR_MAX, ""); } else { i_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", (long) char_max, 0L, (long) UCHAR_MAX, ""); } } if (c_signed) {#ifndef NO_UC Volatile unsigned char c, char_max; c=0; char_max=0; c++; if (setjmp(lab)==0) { /* Yields char_max */ while (c>char_max) { char_max=c; c++; } } Unexpected(4); if (sizeof(char) == sizeof(int)) { u_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", (long) char_max, (long) UCHAR_MAX, ""); } else { i_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", (long) char_max, 0L, (long) UCHAR_MAX, ""); }#endif } else {#ifndef NO_SC/* Define NO_SC if this gives a syntax error */ Volatile signed char c, char_max, char_min; c=0; char_max=0; c++; if (setjmp(lab)==0) { /* Yields char_max */ while (c>char_max) { char_max=c; c++; } } c=0; char_min=0; c--; if (setjmp(lab)==0) { /* Yields char_min */ while (c<char_min) { char_min=c; c--; } } Unexpected(5); i_define(D_SCHAR_MIN, "", "SCHAR", "_MIN", (long) char_min, (long) maxint, (long) SCHAR_MIN, ""); i_define(D_SCHAR_MAX, "", "SCHAR", "_MAX", (long) char_max, 0L, (long) SCHAR_MAX, "");#endif /* NO_SC */ } } return bits_per_byte;}int basic() { /* The properties of the basic types. Returns number of bits per sizeof unit */ Volatile int bits_per_byte; typedef int function (); int variable; int *p, *q; Vprintf("%sSIZES%s\n", co, oc); bits_per_byte= cprop(); /* Shorts, ints and longs *****************************************/ Vprintf("%sshort=%d int=%d long=%d float=%d double=%d bits %s\n", co, (int) sizeof(short)*bits_per_byte, (int) sizeof(int)*bits_per_byte, (int) sizeof(long)*bits_per_byte, (int) sizeof(float)*bits_per_byte, (int) sizeof(double)*bits_per_byte, oc); if (stdc) { Vprintf("%slong double=%d bits%s\n", co, (int) sizeof(Long_double)*bits_per_byte, oc); } Vprintf("%schar*=%d bits%s%s\n", co, (int)sizeof(char *)*bits_per_byte, sizeof(char *)>sizeof(int)?" BEWARE! larger than int!":"", oc); Vprintf("%sint* =%d bits%s%s\n", co, (int)sizeof(int *)*bits_per_byte, sizeof(int *)>sizeof(int)?" BEWARE! larger than int!":"", oc); Vprintf("%sfunc*=%d bits%s%s\n", co, (int)sizeof(function *)*bits_per_byte, sizeof(function *)>sizeof(int)?" BEWARE! larger than int!":"", oc);if (V) printf ("%s%s %s %s%s\n", co, "Type size_t is", ((((false()?( sizeof(int)):(-1)) < 0) )? "signed":"unsigned") , type_of(sizeof( sizeof(int)+0 ) ), oc); showtype("Type size_t is", sizeof(0)); /* Alignment constants ********************************************/#define alignment(TYPE) \ ((long)((char *)&((struct{char c; TYPE d;}*)0)->d - (char *)0)) Vprintf("\n%sALIGNMENTS%s\n", co, oc); Vprintf("%schar=%ld short=%ld int=%ld long=%ld%s\n", co, alignment(char), alignment(short), alignment(int), alignment(long), oc); Vprintf("%sfloat=%ld double=%ld%s\n", co, alignment(float), alignment(double), oc); if (stdc) { Vprintf("%slong double=%ld%s\n", co, alignment(Long_double), oc); } Vprintf("%schar*=%ld int*=%ld func*=%ld%s\n", co, alignment(char *), alignment(int *), alignment(function *), oc); Vprintf("\n"); /* Ten little endians *********************************************/ endian(bits_per_byte); /* Pointers *******************************************************/ Vprintf("\n%sPROPERTIES OF POINTERS%s\n", co, oc); if ((long) (char *) &variable == (long) (int *) &variable) Vprintf("%sChar and int pointer formats seem identical%s\n", co, oc); else Vprintf("%sChar and int pointer formats are different%s\n", co, oc); if ((long) (char *) &variable == (long) (function *) &variable) Vprintf("%sChar and function pointer formats seem identical%s\n", co, oc); else Vprintf("%sChar and function pointer formats are different%s\n", co, oc); if (V) { if ("abcd"=="abcd") printf("%sStrings are shared%s\n", co, oc); else printf("%sStrings are not shared%s\n", co, oc); } p=0; q=0; showtype("Type ptrdiff_t is", p-q); Vprintf("\n%sPROPERTIES OF INTEGRAL TYPES%s\n", co, oc); sprop(); iprop(); lprop(); usprop(); uiprop(); ulprop(); promotions(); Unexpected(6); return bits_per_byte;}#else /* not PASS0 */#ifdef SEPextern jmp_buf lab;extern int V, L, F, bugs, bits_per_byte;extern char co[], oc[];extern char *f_rep();#endif /* SEP */#endif /* ifdef PASS0 *//* As I said, I apologise for the contortions below. The functions are expanded by the preprocessor twice or three times (for float and double, and maybe for long double, and for short, int and long). That way, I never make a change to one that I forget to make to the other. You can look on it as C's fault for not supporting multi-line macro's. This whole file is read 3 times by the preprocessor, with PASSn set for n=1, 2 or 3, to decide which parts to reprocess.*//* #undef on an already undefined thing is (wrongly) flagged as an error by some compilers, therefore the #ifdef that follows:*/#ifdef Number#undef Number#undef THING#undef Thing#undef thing#undef FPROP#undef Fname#undef Store#undef Sum#undef Diff#undef Mul#undef Div#undef ZERO#undef HALF#undef ONE#undef TWO#undef THREE#undef FOUR#undef Self#undef F_check#undef Validate#undef EPROP#undef MARK/* These are the float.h constants */#undef F_RADIX#undef F_MANT_DIG#undef F_DIG#undef F_ROUNDS#undef F_EPSILON#undef F_MIN_EXP#undef F_MIN#undef F_MIN_10_EXP#undef F_MAX_EXP#undef F_MAX#undef F_MAX_10_EXP#endif#ifdef Integer#undef Integer#undef INT#undef IPROP#undef Iname#undef UPROP#undef Uname#undef OK_UI#undef IMARK#undef I_MAX#undef I_MIN#undef U_MAX#endif#ifdef PASS1/* Define the things we're going to use this pass */#define Number float#define THING "FLOAT"#define Thing "Float"#define thing "float"#define Fname "FLT"#define FPROP fprop#define Store fStore#define Sum fSum#define Diff fDiff#define Mul fMul#define Div fDiv#define ZERO 0.0#define HALF 0.5#define ONE 1.0#define TWO 2.0#define THREE 3.0#define FOUR 4.0#define Self fSelf#define F_check fCheck#define MARK "F"#ifdef VERIFY#define Validate(prec, val, req, same) fValidate(prec, val, req, same)#endif#define EPROP efprop#define Integer short#define INT "short"#define IPROP sprop#define Iname "SHRT"#ifndef NO_UI#define OK_UI 1#endif#define IMARK ""#define UPROP usprop#define Uname "USHRT"#ifdef VERIFY#ifdef SHRT_MAX#define I_MAX SHRT_MAX#endif#ifdef SHRT_MIN#define I_MIN SHRT_MIN#endif#ifdef USHRT_MAX#define U_MAX USHRT_MAX#endif#ifdef FLT_RADIX#define F_RADIX FLT_RADIX#endif#ifdef FLT_MANT_DIG#define F_MANT_DIG FLT_MANT_DIG#endif#ifdef FLT_DIG#define F_DIG FLT_DIG#endif#ifdef FLT_ROUNDS#define F_ROUNDS FLT_ROUNDS#endif#ifdef FLT_EPSILON#define F_EPSILON FLT_EPSILON#endif#ifdef FLT_MIN_EXP#define F_MIN_EXP FLT_MIN_EXP#endif#ifdef FLT_MIN#define F_MIN FLT_MIN#endif#ifdef FLT_MIN_10_EXP#define F_MIN_10_EXP FLT_MIN_10_EXP#endif#ifdef FLT_MAX_EXP#define F_MAX_EXP FLT_MAX_EXP#endif#ifdef FLT_MAX#define F_MAX FLT_MAX#endif#ifdef FLT_MAX_10_EXP#define F_MAX_10_EXP FLT_MAX_10_EXP#endif#endif /* VERIFY */#endif /* PASS1 */#ifdef PASS2#define Number double#define THING "DOUBLE"#define Thing "Double"#define thing "double"#define Fname "DBL"#define FPROP dprop#define Store dStore#define Sum dSum#define Diff dDiff#define Mul dMul#define Div dDiv#define ZERO 0.0#define HALF 0.5#define ONE 1.0#define TWO 2.0#define THREE 3.0#define FOUR 4.0#define Self dSelf#define F_check dCheck#define MARK ""#ifdef VERIFY#define Validate(prec, val, req, same) dValidate(prec, val, req, same)#endif#define EPROP edprop#define Integer int#define INT "int"#define IPROP iprop#define Iname "INT"#define OK_UI 1 /* Unsigned int is always possible */#define IMARK ""#define UPROP uiprop#define Uname "UINT"#ifdef VERIFY#ifdef INT_MAX#define I_MAX INT_MAX#endif#ifdef INT_MIN#define I_MIN INT_MIN#endif#ifdef UINT_MAX#define U_MAX UINT_MAX#endif#ifdef DBL_MANT_DIG#define F_MANT_DIG DBL_MANT_DIG#endif#ifdef DBL_DIG#define F_DIG DBL_DIG#endif#ifdef DBL_EPSILON#define F_EPSILON DBL_EPSILON#endif#ifdef DBL_MIN_EXP#define F_MIN_EXP DBL_MIN_EXP#endif#ifdef DBL_MIN#define F_MIN DBL_MIN#endif#ifdef DBL_MIN_10_EXP#define F_MIN_10_EXP DBL_MIN_10_EXP#endif#ifdef DBL_MAX_EXP#define F_MAX_EXP DBL_MAX_EXP#endif#ifdef DBL_MAX#define F_MAX DBL_MAX#endif#ifdef DBL_MAX_10_EXP#define F_MAX_10_EXP DBL_MAX_10_EXP#endif#endif /* VERIFY */#endif /* PASS2 */#ifdef PASS3#ifdef STDC#define Number long double#define ZERO 0.0L#define HALF 0.5L#define ONE 1.0L#define TWO 2.0L#define THREE 3.0L#define FOUR 4.0L#endif#define THING "LONG DOUBLE"#define Thing "Long double"#define thing "long double"#define Fname "LDBL"#define FPROP ldprop#define Store ldStore#define Sum ldSum#define Diff ldDiff#define Mul ldMul#define Div ldDiv#define Self ldSelf#define F_check ldCheck#define MARK "L"#ifdef VERIFY#define Validate(prec, val, req, same) ldValidate(prec, val, req, same)#endif#define EPROP eldprop#define Integer long#define INT "long"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -