__FILE__ & __LINE__ macros specified in C & C++ standards  are useful to provide some debugging information, during run-time. During pre-processing stage of compilation, __FILE__ macro expands to the name of the file being compiled, in the form of a C string constant; and __LINE__ expands to the line number of the source file that is being compiled, in the form of an integer constant.
Run-time anomalies are not uncommon in production environment. Some developers check for pre-, post-conditions for a block of code with the help of assertions. Depending on the severity of the failure/violation/deviation, the program (application) may either crash or continue to run (of course, at the will of the developer who wrote that piece of code). However to minimize errors/failures during run-time, it is often necessary to log the run-time error messages for a later analysis. So, the developer can introduce some statements with __FILE__ & __LINE__ macros, at appropriate places in the source code to log the exact location of the failure, if an inconsistency was detected during run-time.
Here's an example of poorly written C code, that fails to do proper exception handling. However it logs enough information, to locate the failed statement easily.% cat -n file-line-directives.c
     1  #include <stdio.h>
     2  #include <stdlib.h>
     3
     4  int main(int argc, char **argv)
     5  {
     6          FILE *fd;
     7          char *errinfo = NULL;
     8
     9          errinfo = (char *) malloc (sizeof (char) * 50);
    10
    11          fd = fopen (argv[1], "r");
    12          if (fd == NULL)
    13          {
    14                  sprintf (errinfo, "Error at line %d of %s", (__LINE__ - 3), __FILE__);
    15                  perror (errinfo);
    16                  free (errinfo);
    17          }
    18          else
    19          {
    20                  printf ("file descriptor = %d", fileno(fd));
    21                  fclose (fd);
    22          }
    23
    24          return (0);
    25  }
Compiling this code with Sun Studio C (or C++) compiler produces the following result, at run-time:% cc -o directives file-line-directives.c
% ./directives <- needs an argument ie., file name
Error at line 11 of file-line-directives.c: Bad address
% ./directives /tmp/nonexistingfile <- need an existing file name, to open it up for reading
Error at line 11 of file-line-directives.c: No such file or directory
% ls /tmp/*.log
/tmp/activity.log
%./directives /tmp/activity.log
file descriptor = 3
Note:
Since these pre-defined macros are part of the standard(s), they are available with all C and C++ standard compliant compilers.
___________________
Technorati tags: C | C++ | Programming
Wednesday, 26 October 2005
C/C++: About __FILE__ & __LINE__ Macros
Posted on 20:45 by Unknown
Subscribe to:
Post Comments (Atom)
 
 
 
 
 
 
0 comments:
Post a Comment