C从2个函数调用中获取函数行号
在开发小型SDK的过程中,我需要创建一个“错误处理程序”。为了提高效率,我想得到调用函数的行号,我不知道在C中是否可以(使用GCC进行编译) 调用SDK函数时,如果发生错误,SDK函数本身将调用错误处理程序函数 有了这些,我想知道是否有办法从调用函数的用户源代码中知道行号 例如: 用户c:C从2个函数调用中获取函数行号,c,gcc,C,Gcc,在开发小型SDK的过程中,我需要创建一个“错误处理程序”。为了提高效率,我想得到调用函数的行号,我不知道在C中是否可以(使用GCC进行编译) 调用SDK函数时,如果发生错误,SDK函数本身将调用错误处理程序函数 有了这些,我想知道是否有办法从调用函数的用户源代码中知道行号 例如: 用户c: main{ CallSDKFunction(); } SDK.a文件: void CallSDKFunction( void ){ if ( ERROR ){ CallERRORHandler(); } }
main{ CallSDKFunction(); }
SDK.a文件:
void CallSDKFunction( void ){ if ( ERROR ){ CallERRORHandler(); } }
。。。
...
如果我正确理解了您的要求,您可以使用
\uuuu FILE\uuuu
和\uuu LINE\uuuu
宏获取任何指令的文件名和行号。这两个是标准的预定义宏。你可以查一下
此外,还有(C99
)提供当前函数名
因此,您可以根据需要定义另一个函数原型(可能处于调试
模式),它在进行函数调用时传递(并接受)额外的参数,如\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
、\uuuuuuuuuuuuuu。然后,您可以从被调用函数中显示调用者函数名和行
或者,您也可以查看函数。但是,它是一个GNU扩展。C预处理器具有特殊的标记\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
和\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
要使其工作,必须声明包装宏:
void error(int line, const char *file)
{
fprintf(stderr, "Error in %s, line %d\n", file, line);
// handle error
}
#define ERROR() error(__LINE__, __FILE__)
这将把有关宏调用位置的信息传递给错误处理程序。一种方法是将\uuuuu文件和\uuuuuuu行
传递给SDK函数,然后让SDK函数将它们传递给错误处理程序函数。但是,用户不想为此烦恼,因此需要在SDK的头文件中定义一个宏来隐藏细节。宏将如下所示
#define CallSDKFunction(a,b) actualSDKFunction( __FILE__, __LINE__, a, b )
int actualSDKFunction( const char *fileStr, int lineNum, int a, int b )
{
if ( a+b > 5 )
CallERRORHandler( fileStr, lineNum );
return( a+b );
}
void CallERRORHandler( const char *fileStr, int lineNum )
{
printf( "Bad values in file %s at line %d\n", fileStr, lineNum );
}
用户将使用如下代码调用SDK。请注意,用户不需要知道\uuuuuu文件和\uuuuu行
正在传递给SDK函数。宏处理这个问题
int main( void )
{
int a = 3;
int b = 4;
int result = CallSDKFunction( a, b );
printf( "%d\n", result );
}
SDK的实现是这样的
#define CallSDKFunction(a,b) actualSDKFunction( __FILE__, __LINE__, a, b )
int actualSDKFunction( const char *fileStr, int lineNum, int a, int b )
{
if ( a+b > 5 )
CallERRORHandler( fileStr, lineNum );
return( a+b );
}
void CallERRORHandler( const char *fileStr, int lineNum )
{
printf( "Bad values in file %s at line %d\n", fileStr, lineNum );
}
哇!多谢各位。根据我的理解(我是法国人,所以我的英语不是完美的:p),这正是我需要的。是的,我知道:)我找到了如何修改原始问题,删除了不好的问题,并添加了缺少的问题;)