在 C99 中使用检查单元测试框架时出现语法错误

发布于 2024-10-22 13:31:20 字数 2493 浏览 6 评论 0原文

当我尝试使用 检查单元测试框架 和 <代码>-std=c99 标志。

因此,我尝试

#include <check.h>
START_TEST(example) {
  fail();
} END_TEST
int main(int argc, char** argv){ return 0; }

使用 autotools 和 Makefile.am:

check_PROGRAMS = example
example_SOURCES = example.c
example_CFLAGS = @CHECK_CFLAGS@ -Wall -pedantic -std=c99
example_LDADD = @CHECK_LIBS@

configure.ac: 编译 example.c:

AC_PREREQ([2.61])
AC_INIT([example], [1.0.0], [[email protected]])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_SRCDIR([example.c])

AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_RANLIB

PKG_CHECK_MODULES([CHECK], [check >= 0.9.5])

AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])

AC_C_CONST
AC_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_SIZE_T
AC_TYPE_UINT32_T

AC_FUNC_FORK
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_FUNC_STAT
AC_CHECK_FUNCS([memset])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

但是我得到这个奇怪的错误:

% make check
make  example
gcc -DPACKAGE_NAME=\"example\" -DPACKAGE_TARNAME=\"example\" -DPACKAGE_VERSION=\"1.0.0\" -DPACKAGE_STRING=\"example\ 1.0.0\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE=\"example\" -DVERSION=\"1.0.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FORK=1 -DHAVE_VFORK=1 -DHAVE_WORKING_VFORK=1 -DHAVE_WORKING_FORK=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_STDLIB_H=1 -DHAVE_REALLOC=1 -DHAVE_MEMSET=1 -I.    -I/opt/local/include   -std=c99 -g -O2 -MT example-example.o -MD -MP -MF .deps/example-example.Tpo -c -o example-example.o `test -f 'example.c' || echo './'`example.c
example.c: In function 'example':
example.c:3: error: parse error before ',' token
make[1]: *** [example-example.o] Error 1
make: *** [check-am] Error 2

所以它在 fail() 中发现语法错误(我认为 check 作为宏实现)。如果我删除 -std=c99 标志,语法错误就会消失,并且工作正常。

有什么办法可以解决这个问题吗?我绝对想要 -std=c99 以便编译器可以使用我对可变参数宏的使用(以及 check.h 的使用)。

I'm running into a weird syntax error when I try to compile tests using the check unit testing framework with the -std=c99 flag.

So, I'm trying to compile the example.c:

#include <check.h>
START_TEST(example) {
  fail();
} END_TEST
int main(int argc, char** argv){ return 0; }

using autotools, with Makefile.am:

check_PROGRAMS = example
example_SOURCES = example.c
example_CFLAGS = @CHECK_CFLAGS@ -Wall -pedantic -std=c99
example_LDADD = @CHECK_LIBS@

and configure.ac:

AC_PREREQ([2.61])
AC_INIT([example], [1.0.0], [[email protected]])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_SRCDIR([example.c])

AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_RANLIB

PKG_CHECK_MODULES([CHECK], [check >= 0.9.5])

AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])

AC_C_CONST
AC_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_SIZE_T
AC_TYPE_UINT32_T

AC_FUNC_FORK
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_FUNC_STAT
AC_CHECK_FUNCS([memset])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

However I get this weird error:

% make check
make  example
gcc -DPACKAGE_NAME=\"example\" -DPACKAGE_TARNAME=\"example\" -DPACKAGE_VERSION=\"1.0.0\" -DPACKAGE_STRING=\"example\ 1.0.0\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE=\"example\" -DVERSION=\"1.0.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FORK=1 -DHAVE_VFORK=1 -DHAVE_WORKING_VFORK=1 -DHAVE_WORKING_FORK=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_STDLIB_H=1 -DHAVE_REALLOC=1 -DHAVE_MEMSET=1 -I.    -I/opt/local/include   -std=c99 -g -O2 -MT example-example.o -MD -MP -MF .deps/example-example.Tpo -c -o example-example.o `test -f 'example.c' || echo './'`example.c
example.c: In function 'example':
example.c:3: error: parse error before ',' token
make[1]: *** [example-example.o] Error 1
make: *** [check-am] Error 2

So it's finding a syntax error in fail() (which I suppose check implements as a macro). If I remove the -std=c99 flag, the syntax error goes away, and it works fine.

Is there a way I can fix this? I definitely want -std=c99 so that my use (and check.h's use) of variadic macros is ok'd by the compiler.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月寒剑心 2024-10-29 13:31:20

该网站上的基本教程始终显示START_TESTEND_TEST 宏之间调用失败。他们很可能为这些宏设置了一些东西。 完成。

现在,要编译它,您需要做的就是给 fail() 一个参数。

它的定义如下:

#define fail(...) _fail_unless(0, __FILE__, __LINE__, "Failed" , ## __VA_ARGS__, NULL)

如果没有给出参数,它将有一个杂散的 ,

The basic tutorial on that site always shows the fail called between START_TEST and END_TEST macros. They most likely set some things up for these macros. Done.

Now all you need to get that to compile is give fail() an argument.

It's defined like this:

#define fail(...) _fail_unless(0, __FILE__, __LINE__, "Failed" , ## __VA_ARGS__, NULL)

Which will have a stray , if no argument is given.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文