您的位置:首页 > 其它

C macros __LINE__, __FILE__ and __func__

2015-01-27 10:46 330 查看
It is possible for a C program to print the currently executing line of source code, the file of the source code, and the name of the current function. The currently executing line is available in a preprocessor variable called
__LINE__
:
<span class="preprocessor">#include <<a target=_blank href="http://www.nxmnpg.com/3/stdio" style="color: rgb(51, 102, 153); text-decoration: none;">stdio</a>.h>
</span>
<span class="type">int</span> <span class="function-name">main</span> ()
{
    <span class="function-name"><a target=_blank href="http://www.nxmnpg.com/3/printf" style="color: rgb(51, 102, 153); text-decoration: none;">printf</a></span> (<span class="string">"This is line %d.\n"</span>, <span class="variable-name">__LINE__</span>);
    <span class="keyword">return</span> <span class="number">0</span>;
}


This prints out
This is line 5.


To get the name of the file, use the preprocessor variable
__FILE__
:
<span class="preprocessor">#include <<a target=_blank href="http://www.nxmnpg.com/3/stdio" style="color: rgb(51, 102, 153); text-decoration: none;">stdio</a>.h>
</span>
<span class="type">int</span> <span class="function-name">main</span> ()
{
    <span class="function-name"><a target=_blank href="http://www.nxmnpg.com/3/printf" style="color: rgb(51, 102, 153); text-decoration: none;">printf</a></span> (<span class="string">"This is line %d of file \"%s\".\n"</span>,
            <span class="variable-name">__LINE__</span>, <span class="variable-name">__FILE__</span>);
    <span class="keyword">return</span> <span class="number">0</span>;
}


This prints out
This is line 6 of file "/share/websites/www.lemoda.net/c/line-file-func/file.c".


C99 (the most recent version of the C language, at the time of writing) introduced another macro called
__func__
which also names the function in use:
<span class="preprocessor">#include <<a target=_blank href="http://www.nxmnpg.com/3/stdio" style="color: rgb(51, 102, 153); text-decoration: none;">stdio</a>.h>
</span>
<span class="preprocessor">#define BLURT <a target=_blank href="http://www.nxmnpg.com/3/printf" style="color: rgb(51, 102, 153); text-decoration: none;">printf</a> ("This is line %d of file %s (function %s)\n",\
                      __LINE__, __FILE__, __func__)
</span>
<span class="type">void</span> <span class="function-name">silly_function</span> ()
{
    <span class="variable-name">BLURT</span>;
}

<span class="type">int</span> <span class="function-name">main</span> ()
{
    <span class="variable-name">BLURT</span>;
    <span class="function-name">silly_function</span> ();
    <span class="keyword">return</span> <span class="number">0</span>;
}


This prints out
This is line 13 of file /share/websites/www.lemoda.net/c/line-file-func/func.c (function main)
This is line 8 of file /share/websites/www.lemoda.net/c/line-file-func/func.c (function silly_function)


You can change the values used for
__FILE__
and
__LINE__
using a line directive, which is a preprocessor command of the form
#line 20 "some-file"


which tells the C compiler that the next line after the line directive is line 20 of
some-file
.
<span class="preprocessor">#include <<a target=_blank href="http://www.nxmnpg.com/3/stdio" style="color: rgb(51, 102, 153); text-decoration: none;">stdio</a>.h>
</span>
<span class="preprocessor">#define BLURT <a target=_blank href="http://www.nxmnpg.com/3/printf" style="color: rgb(51, 102, 153); text-decoration: none;">printf</a> ("This is line %d of file \"%s\" (function <%s>)\n",\
                      __LINE__, __FILE__, __func__)
</span>
<span class="preprocessor">#line 99 "grody-to-the-max"
</span><span class="type">void</span> <span class="function-name">silly_function</span> ()
{
    <span class="variable-name">BLURT</span>;
}

<span class="preprocessor">#line 999 "bassetts-liquorice-allsorts"
</span><span class="type">int</span> <span class="function-name">main</span> ()
{
    <span class="variable-name">BLURT</span>;
    <span class="function-name">silly_function</span> ();
    <span class="keyword">return</span> <span class="number">0</span>;
}


This prints out
This is line 1001 of file "bassetts-liquorice-allsorts" (function <main>)
This is line 101 of file "grody-to-the-max" (function <silly_function>)


This line directive is used by facilities like "lex" and "yacc" which output C code so that error messages are related to the input file rather than the output C file.

GCC (the "Gnu Compiler Collection") also defines
__FUNCTION__
and
__PRETTY_FUNCTION__
. These are both the same as
__func__
for C. For C++,
__PRETTY_FUNCTION__
is something different.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: