This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Macro define vs var data type

Hi,
I'm just curios on how this work.
Is this a general C/C++ process or C51?

In main.h, I have a:

#define MAX_TIME_OUT      3000         //This is beyond U8

In Worker.c, I have Timer 2 ISR:

#include "main.h"

U8 _temp_cntr;                          //unsigned char and not initialized

//T2 init here

void T2_ISR() interrupt using 0
{
   //some flag being set here

   _temp_cntr++;                        //Should this be back to 0 when reach 255?
   if(_temp_cntr == MAX_TIME_OUT)       //What will happen here?
   {
       _temp_cntr = 0;
   }
}

Hope somebody can enlighten me on this.
My UART1 on F387 mcu won't able to run when Timer 2 ISR is enabled because of the specific condition under the ISR.

thanks
gp

Parents
  • No, #define doesn't have any data type.

    It isn't really part of the C language, even if it is part of the C language standard. There are almost no rules about what you can write after the symbol name (you have a few operators like # and ##, and it knows that when removing comments it has to insert some whitespace instead of the comment).

    #defines are just an advanced search/replace functionality in the language.

    So when the compiler is ready to generate code, it does not process

    if (var == def) ...
    


    but instead

    if (var == expansion) ...
    

    Your code is then:

    if (_temp_cntr == 3000) ...
    

    If _tmp_cntr can never store a value larger than 255 without rolling back to the value zero, you can continue to increment, and increment and increment until you get a power failure. The if statement will still never be true. Some compilers will - if full warnings are enabled - add an explicit warning about impossible numeric-range comparisons.

Reply
  • No, #define doesn't have any data type.

    It isn't really part of the C language, even if it is part of the C language standard. There are almost no rules about what you can write after the symbol name (you have a few operators like # and ##, and it knows that when removing comments it has to insert some whitespace instead of the comment).

    #defines are just an advanced search/replace functionality in the language.

    So when the compiler is ready to generate code, it does not process

    if (var == def) ...
    


    but instead

    if (var == expansion) ...
    

    Your code is then:

    if (_temp_cntr == 3000) ...
    

    If _tmp_cntr can never store a value larger than 255 without rolling back to the value zero, you can continue to increment, and increment and increment until you get a power failure. The if statement will still never be true. Some compilers will - if full warnings are enabled - add an explicit warning about impossible numeric-range comparisons.

Children