When writing C language, macro definitions are very important!

Click " C Language and CPP Programming " above, select " Follow/ Top/Star Official Account "

Dry goods benefits, the first time to deliver!

Source: Play with Embedded

When writing C language, beautiful macro definitions are very important! Using macro definitions can prevent errors, improve portability, readability, convenience, etc. The following lists some commonly used macro definitions in mature software.

1. Prevent a header file from being repeatedly included

1#ifndef COMDEF_H
2#define COMDEF_H
3//头文件内容
4#endif

2. Redefine some types to prevent the difference in the number of type bytes due to different platforms and compilers, which is convenient for porting.

1typedef unsigned char boolean; /* Boolean value type. */
2typedef unsigned long int uint32; /* Unsigned 32 bit value */
3typedef unsigned short uint16; /* Unsigned 16 bit value */
4typedef unsigned char uint8; /* Unsigned 8 bit value */
5typedef signed long int int32; /* Signed 32 bit value */
6typedef signed short int16; /* Signed 16 bit value */
7typedef signed char int8; /* Signed 8 bit value */

Not recommended for use:

1typedef unsigned char byte; /* Unsigned 8 bit value type. */
 2typedef unsigned short word; /* Unsinged 16 bit value type. */
 3typedef unsigned long dword; /* Unsigned 32 bit value type. */
 4typedef unsigned char uint1; /* Unsigned 8 bit value type. */
 5typedef unsigned short uint2; /* Unsigned 16 bit value type. */
 6typedef unsigned long uint4; /* Unsigned 32 bit value type. */
 7typedef signed char int1; /* Signed 8 bit value type. */
 8typedef signed short int2; /* Signed 16 bit value type. */
 9typedef long int int4; /* Signed 32 bit value type. */
10typedef signed long sint31; /* Signed 32 bit value */
11typedef signed short sint15; /* Signed 16 bit value */
12typedef signed char sint7; /* Signed 8 bit value */

3. Get a byte or word at the specified address

1#define MEM_B( x ) ( *( (byte *) (x) ) )
2#define MEM_W( x ) ( *( (word *) (x) ) )

4. Find the maximum and minimum values

1#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
2#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

5. Get the offset of a field in the structure (struct)

1#define FPOS( type, field ) \
2/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

6. Get the number of bytes occupied by the field in a structure

1#define FSIZ( type, field ) sizeof( ((type *) 0)->field )

7. Convert two bytes to a Word according to LSB format

1#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

8. Convert a Word to two bytes according to LSB format

1#define FLOPW( ray, val ) \
2(ray)[0] = ((val) / 256); \
3(ray)[1] = ((val) & 0xFF)

9. Get the address of a variable (word width)

1#define B_PTR( var ) ( (byte *) (void *) &(var) )
2#define W_PTR( var ) ( (word *) (void *) &(var) )

10. Get the high and low bytes of a word

1#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))
2#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))

11. Returns the nearest multiple of 8 greater than X

1#define RND8( x ) ((((x) + 7) / 8 ) * 8 )

12. Convert a letter to uppercase

1#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

13. Determine if a character is a decimal number

1#define DECCHK( c ) ((c) >= '0' && (c) <= '9')

14. Determine if a character is a hexadecimal number

1#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\
2((c) >= 'A' && (c) <= 'F') ||\
3((c) >= 'a' && (c) <= 'f') )

15. A way to prevent overflow

1#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

16. Return the number of elements in an array

1#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

17. Return an unsigned n-tail value MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)

1#define MOD_BY_POWER_OF_TWO( val, mod_by ) \
2( (dword)(val) & (dword)((mod_by)-1) )

18. For the structure of the IO space mapped in the storage space, input and output processing:

1#define inp(port) (*((volatile byte *) (port)))
2#define inpw(port) (*((volatile word *) (port)))
3#define inpdw(port) (*((volatile dword *)(port)))
4#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))
5#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))
6#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))

19. Trace debugging with some macros

The ANSI standard specifies five predefined macro names, which are:

1_ L I N E _
2_ F I L E _
3_ D A T E _
4_ T I M E _
5_ S T D C _

If compilation is not standard, only a few of the above macro names may be supported, or none at all. Remember that the compiler may also provide other predefined macro names.

_ L I N E _and _ F I L E _macros are discussed in the relevant # l i n esections, the rest of the macro names are discussed here.

_ D AT E _The macro contains a string of the form month/day/year representing the date when the source file was translated into code.

The time of translation of the source code to the object code is included as a string _ T I M E _. The string format is hours:minutes:seconds.

If the implementation is standard, the macro _ S T D C _contains the decimal constant 1. If it contains any other number, the implementation is non-standard.

Macros can be defined, for example: when defined _DEBUG, output data information and the line of the file where it is located.

1#ifdef _DEBUG
2#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
3#else
4#define DEBUGMSG(msg,date)
5#endif

20. Macro definitions prevent incorrect use of parentheses.

E.g:

1#define ADD(a,b) (a+b)

Use do{}while(0)statements containing multiple statements to prevent errors, for example:

1#difne DO(a,b) a+b;\
2a++;

When applying:

1if(….)
2DO(a,b); //产生错误
3else

Solution:

1#define DO(a,b) do{a+b;\
2a++;}while(0)

Copyright statement: The content comes from the Internet, and the copyright belongs to the original creator. Unless it cannot be confirmed, the author and source will be marked. If there is any infringement, please let us know, we will delete it immediately and apologize!

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324125848&siteId=291194637