Mandalika's scratchpad [ Work blog @Oracle | My Music Compositions ]

Old Posts: 09.04  10.04  11.04  12.04  01.05  02.05  03.05  04.05  05.05  06.05  07.05  08.05  09.05  10.05  11.05  12.05  01.06  02.06  03.06  04.06  05.06  06.06  07.06  08.06  09.06  10.06  11.06  12.06  01.07  02.07  03.07  04.07  05.07  06.07  08.07  09.07  10.07  11.07  12.07  01.08  02.08  03.08  04.08  05.08  06.08  07.08  08.08  09.08  10.08  11.08  12.08  01.09  02.09  03.09  04.09  05.09  06.09  07.09  08.09  09.09  10.09  11.09  12.09  01.10  02.10  03.10  04.10  05.10  06.10  07.10  08.10  09.10  10.10  11.10  12.10  01.11  02.11  03.11  04.11  05.11  07.11  08.11  09.11  10.11  11.11  12.11  01.12  02.12  03.12  04.12  05.12  06.12  07.12  08.12  09.12  10.12  11.12  12.12  01.13  02.13  03.13  04.13  05.13  06.13  07.13  08.13  09.13  10.13  11.13  12.13  01.14  02.14  03.14  04.14  05.14  06.14  07.14  09.14  10.14  11.14  12.14  01.15  02.15  03.15  04.15  06.15  09.15  12.15  01.16  03.16  04.16  05.16  06.16  07.16  08.16  09.16  12.16  01.17  02.17  03.17  04.17  06.17  07.17  08.17  09.17  10.17  12.17  01.18  02.18  03.18  04.18  05.18  06.18  07.18  08.18  09.18  11.18  12.18  01.19  02.19  05.19  06.19  08.19  10.19  11.19  05.20  10.20  11.20  12.20  09.21  11.21  12.22 


Wednesday, October 26, 2005
 
C/C++: About __FILE__ & __LINE__ Macros

__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: | |


Comments:
thanks giri.. very useful info
 
Nice snippet. Appreciate very much.
 
Post a Comment



<< Home


2004-2019 

This page is powered by Blogger. Isn't yours?