C - 跨平台宏定义

  1 #ifndef _H_INCLUDED
  2 #define _H_INCLUDED
  3
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <stdarg.h>
  7 #include <float.h>
  8 #include <string.h>
  9 #include <math.h>
 10 #include <limits.h>
 11 #include <direct.h>
 12
 13 #define DEBUG
 14 #define USE_WINDOWS
 15
 16 /*********************************************/
 17 #if defined(USE_WINDOWS)
 18 #define DIR_SEPERATOR ‘\\‘
 19 #else
 20 #define DIR_SEPERATOR ‘/‘
 21 #endif
 22 /*********************************************/
 23
 24 /*********************************************/
 25 #if LONG_MAX >> 31 > 0
 26 #define WORD_BYTES 8     /* 64-bit */
 27 #elif INT_MAX >> 15 > 0
 28 #define WORD_BYTES 4     /* 32-bit */
 29 #else
 30 #define WORD_BYTES 2     /* 16-bit */
 31 #endif
 32 /*********************************************/
 33
 34 /*********************************************/
 35 #if WORD_BYTES == 8
 36
 37 typedef signed long intx;
 38 typedef unsigned long uintx;
 39 typedef signed int int32;
 40 typedef unsigned int uint32;
 41
 42 #elif WORD_BYTES == 4
 43
 44 typedef signed int intx;
 45 typedef unsigned int uintx;
 46 typedef signed int int32;
 47 typedef unsigned int uint32;
 48
 49 #else
 50
 51 typedef signed int intx;
 52 typedef unsigned int uintx;
 53 typedef signed long int32;
 54 typedef unsigned long uint32;
 55
 56 #endif /* WORD_BYTES */
 57 /*********************************************/
 58
 59 /*********************************************/
 60 #define REAL_TYPE_FLOAT            1
 61 #define REAL_TYPE_DOUBLE         2
 62 #define REAL_TYPE_LONGDOUBLE    3
 63 /*********************************************/
 64
 65 /*********************************************/
 66 #ifndef REAL_TYPE
 67
 68 #if WORD_BYTES == 8
 69 #define REAL_BYTES     8
 70 #define REAL_TYPE     REAL_TYPE_DOUBLE
 71 #else
 72 #define REAL_BYTES     4
 73 #define REAL_TYPE     REAL_TYPE_FLOAT
 74 #endif /* WORD_BYTES */
 75
 76 #endif /* REAL_TYPE */
 77 /*********************************************/
 78
 79 /*********************************************/
 80 #if REAL_TYPE == REAL_TYPE_FLOAT
 81
 82 typedef float real;
 83 #define REAL_FORMAT        "%.7g"
 84 #define real_limit(n)     FLT_##n
 85 #define math_op(op)     op##f
 86 #define math_s2r(s,p)    (strtof((s),(p)))
 87
 88 #elif REAL_TYPE == REAL_TYPE_DOUBLE
 89
 90 typedef double real;
 91 #define REAL_FORMAT        "%.14g"
 92 #define real_limit(n)     DBL_##n
 93 #define math_op(op)        op##d
 94 #define math_s2r(s,p)    (strtod((s),(p)))
 95
 96 #elif REAL_TYPE == REAL_TYPE_LONGDOUBLE
 97
 98 #define REAL_FORMAT        "%.19g"
 99 #define real_limit(n)     LDBL_##n
100 #define math_op(op)        op##l
101 #define math_s2r(s,p)    (strtold((s),(p)))
102
103 #else
104
105 #error "numeric float type not defined"
106
107 #endif
108 /*********************************************/
109
110 /*********************************************/
111 typedef signed short int16;
112 typedef unsigned short uint16;
113 typedef signed char int8;
114 typedef unsigned char uint8;
115 typedef unsigned char byte;
116 typedef unsigned char boolean;
117 typedef void *Pointer;
118 typedef char *Chars;
119 typedef FILE *File;
120 /*********************************************/
121
122 /*********************************************/
123 #define bitsof(t) (sizeof(t)<<3)
124 #define cast_type(t, x) ((t)(x))
125 #define cast_intx(x) ((intx)(x))
126 #define cast_uintx(x) ((uintx)(x))
127 #define cast_int32(x) ((int32)(x))
128 #define cast_uint32(x) ((uint32)(x))
129 #define cast_int16(x) ((int16)(x))
130 #define cast_uint16(x) ((uint16)(x))
131 #define cast_int8(x) ((int8)(x))
132 #define cast_uint8(x) ((uint8)(x))
133 #define cast_byte(x) ((byte)(x))
134 #define cast_boolean(x) ((boolean)(!!(x)))
135 #define cast_void(x) ((void)(x))
136 #define cast_Chars(x) ((Chars)(x))
137 #define cast_Pointer(x) ((Pointer)(x))
138 #define struct_new(t) ((t)calloc(1, sizeof_type(t)))
139 #define struct_alloc(t) ((t)malloc(sizeof_type(t)))
140 #define array_size(a) (sizeof(a)/sizeof(*(a)))
141 #define math_max(x, y) ((x) > (y) ? (x) : (y))
142 #define math_min(x, y) ((x) < (y) ? (x) : (y))
143 #define math_swap(x, y) ((x) ^= (y) ^= (x) ^= (y))
144 #define math_abs(x) ((x) < 0 ? -(x) : (x))
145 #define math_sign(x) ((x) < 0 ? -1 : ((x) ? 1 : 0))
146 #define math_r2i(r, i) ((i = (r)) == (r))
147 #define math_pow2(n) (1 << (n))
148 /*********************************************/
149
150 /*********************************************/
151 #ifdef DEBUG
152 #define debug_assert(c) ((c)||printf("debug>> assertion failed: %s, #%d, "#c"\n",__FILE__,__LINE__))
153 #else
154 #define debug_assert(c) ((void)0)
155 #endif
156 /*********************************************/
157
158 #endif
时间: 2024-11-07 11:52:39

C - 跨平台宏定义的相关文章

[转] 关于VS中区分debug与release,32位与64位编译的宏定义

在vs编程中,常常涉及到32位和64位程序的编译,怎么判断当前编译是32位编译还是64位编译?如何判断 是debug下编译还是release下编译?因为之前用到,这里记录一下,省的忘了又要疯狂的google. 1.判断是debug编译还是release编译. 如果_DEBUG定义了表示是debug编译,否则是release编译. 2.判断是32位编译还是64位编译. 在 Win32 配置下,_WIN32 有定义,_WIN64 没有定义.在 x64 配置下,两者都有定义.即在 VC 下,_WIN3

宏定义的黑魔法 - 宏菜鸟起飞手册

转载:https://onevcat.com/2014/01/black-magic-in-macro/ 宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多.但是使用宏定义的好处是不言自明的,在节省工作量的同时,代码可读性大大增加.如果想成为一个能写出漂亮优雅代码的开发者,宏定义绝对是必不可少的技能(虽然宏本身

宏定义(转)

摘抄自:http://blog.chinaunix.net/uid-17188120-id-4026378.html 1.简单的宏定义 #define 标识符 替换列表(替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量.注意:替换列表是可以为空的) 典型的使用方法: 定义值为空 #define BUG 重新定义数据类型 #define IT int 2.带参数的宏 #define 标识符(x1,x2,x3...xn) 替换列表  (注意:x1,x2,x3..是宏的参数,

iOS开发笔记--宏定义的黑魔法 - 宏菜鸟起飞手册

宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多.但是使用宏定义的好处是不言自明的,在节省工作量的同时,代码可读性大大增加.如果想成为一个能写出漂亮优雅代码的开发者,宏定义绝对是必不可少的技能(虽然宏本身可能并不漂亮优雅XD).但是因为宏定义对于很多人来说,并不像业务逻辑那样是每天会接触的东西.即使是能偶尔使

iOS 7:漫谈#define 宏定义(转)

iOS 7:漫谈#define 宏定义 #define宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多.但是使用宏定义的好处是不言自明的,在节省工作量的同时,代码可读性大大增加. 如果想成为一个能写出漂亮优雅代码的开发者,宏定义绝对是必不可少的技能(虽然宏本身可能并不漂亮优雅XD).但是因为宏定义对于很多人来

iOS 7:漫谈#define 宏定义

#define宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多.但是使用宏定义的好处是不言自明的,在节省工作量的同时,代码可读性大大增加. 如果想成为一个能写出漂亮优雅代码的开发者,宏定义绝对是必不可少的技能(虽然宏本身可能并不漂亮优雅XD).但是因为宏定义对于很多人来说,并不像业务逻辑那样是每天会接触的东西

宏定义中的#,##,...,do{}while(0),__VA_ARGS__

宏定义中的#,## 1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define syslog(a) fprintf(stderr,"Warning: " #a"\n"); 2.简单的说,"## "是一种分隔连接方式,它的作用是先分隔,然后进行强制连接 举列 -- 试比较下述几个宏定义的区别 #define A1(name, type)  type name_##type##_type 或 #define A

笔记3:预处理器-(2)宏定义

#define指令称为宏定义指令,通常用#define指令来定义一个宏用来代表其他东西的一个名字(如常量表达式等).通常来说预处理器会通过将宏的名字和它的定义存储在一起来响应#define指令.当这个宏在后面的程序中使用到时,预处理器会"扩展"宏,将宏替换为其定义值. 简单的宏 简单的宏的定义格式: #define 标识符 替换列表 如: #define DTE_LEN 80 #define TRUE 1 #define FALSE 0 #define PI 3.1415926 #de

宏定义中使用do{}while(0)的好处 (转载)

宏定义中使用do{}while(0)的好处   #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo() do{}while(0) 2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现. 3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现: #define foo(x) /action1(); /action2(); 在以下情况