当我尝试使用check unit testing framework和-std=c99
标志编译测试时,我遇到了一个奇怪的语法错误。使用C99检查单元测试框架时的语法错误
所以,我试图编译example.c
:
#include <check.h>
START_TEST(example) {
fail();
} END_TEST
int main(int argc, char** argv){ return 0; }
使用自动工具,与Makefile.am
:
check_PROGRAMS = example
example_SOURCES = example.c
example_CFLAGS = @[email protected] -Wall -pedantic -std=c99
example_LDADD = @[email protected]
和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
不过,我得到这个怪异错误:
% 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()
(我认为检查实现为宏)的语法错误。如果我删除-std=c99
标志,语法错误消失,并且它工作正常。
有没有办法解决这个问题?我绝对想要-std=c99
,以便我的编译器可以使用可变宏的使用(和check.h
)。
是否有什么特别的理由在'example_CFLAGS = @ CHECK_CFLAGS @ ...'之类使用'@@'替换?我总是发现在这种情况下'$(CHECK_CFLAGS)'更容易使用,因为调用'make'的用户可以轻松地覆盖'CHECK_CFLAGS'来调试构建失败和类似事情。 – ndim 2011-04-14 23:09:32