在开发一个小型SDK的过程中,我需要创建一个“错误处理程序”。为了更有效,我想获取调用函数的行号,但我不知道在 C 中是否可以(使用 GCC 进行编译)。
当调用SDK函数时,如果发生错误,SDK函数本身会调用错误处理函数。
因此,我想知道是否有办法从调用该函数的用户源代码中了解行号。
示例:
用户.c:
main{ CallSDKFunction(); }
SDK.a文件:
void CallSDKFunction( void ){ if ( ERROR ){ CallERRORHandler(); } }
... ... ...
void CallERRORHandler( void ){ // Here I want to know in which line in user.c the CallSDKFunction was called}
最佳答案
一种方法是将 __FILE__
和 __LINE__
传递给 SDK 函数,然后让 SDK 函数将它们传递给错误处理函数。但是,用户不想为此烦恼,因此您需要在 SDK 的头文件中定义一个隐藏详细信息的宏。宏看起来像这样
#define CallSDKFunction(a,b) actualSDKFunction( __FILE__, __LINE__, a, b )
用户将使用如下代码调用 SDK。请注意,用户不需要知道 __FILE__
和 __LINE__
正在传递给 SDK 函数。宏会处理这个问题。
int main( void )
{
int a = 3;
int b = 4;
int result = CallSDKFunction( a, b );
printf( "%d\n", result );
}
SDK 实现会是这样的
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 );
}
关于C 从 2 个函数调用中获取函数行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932309/