C 如何定义断言函数接收无限参数并打印它们
我定义了一个断言函数,只是为了打印函数名和行号,但是我遇到了分段错误(内核转储),如何修复它C 如何定义断言函数接收无限参数并打印它们,c,segmentation-fault,c-preprocessor,assert,C,Segmentation Fault,C Preprocessor,Assert,我定义了一个断言函数,只是为了打印函数名和行号,但是我遇到了分段错误(内核转储),如何修复它 #define assert( string ) \ printf("%s - %s assert %s\n",__FUNCTION__, __LINE__, #string); int main(int argc, char **argv) { assert( "test assert" ); printf("%s(%d)-%s: this is main\n",__FILE
#define assert( string ) \
printf("%s - %s assert %s\n",__FUNCTION__, __LINE__, #string);
int main(int argc, char **argv)
{
assert( "test assert" );
printf("%s(%d)-%s: this is main\n",__FILE__,__LINE__,__FUNCTION__);
return 0;
}
最终目标是定义函数来打印参数传递的所有信息,如
printf
receive unlimited参数 根据您的问题,我假设您要求的是断言宏
当您断言时,您断言的条件为真或假。你不只是传递一个字符串
试试这个
#define ASSERT(cond_, fmt, ...) do \
{ \
if(!(cond_)) \
{ \
printf("assert: file %s line %d ", \
__FILE__, __LINE__); \
fprintf(stderr, fmt, __VA_ARGS__); \
fflush(stderr); \
abort(); \
} \
} while(0)
对于gcc,fprintf
行必须定义为
fprintf(stderr, fmt, ##__VA_ARGS__); \
不过,将断言功能定义为函数并将该函数包装到宏中是一个很好的策略
- 宏有助于在发布版本中轻松禁用断言
- 该函数为调试时放置断点提供了一个很好的位置
\uuuuuuuuuuuuuuuuuu
是一个int
,而不是一个字符串。您需要将其与%d
一起使用,而不是与%s
一起使用。另外,#string
将参数字符串化,但您已经在传递一个字符串。这个问题与接收无限数量的参数没有任何关系…谢谢@保罗·鲁尼解决了我所有的问题。为什么do。。。while()
仅运行一次时循环?@binaryBaBa