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