FLAG=-DNDEBUG 不禁用 c 中的 assert()

FLAG=-DNDEBUG not disabling assert() in c

我有一堆 assert() 我在我的 C 文件中使用的函数,从 reading 我已经完成了我应该能够通过传入命令行参数来禁用断言,如下所示:

make

这样做不会禁用断言。但是,在代码中添加 #define NDEBUG 确实会禁用断言。不过,我想从命令行禁用它们,是否有任何原因导致此标志无法正常工作。

我在 Windows 机器上。

这是生成文件:

OPTIONS = -B CFLAGS=-DNDEBUG -ansi -pedantic -Wall -Werror

a.out: myProgram.o StudentImplementation.o ListImplementation.o
    gcc $(OPTIONS) myProgram.o StudentImplementation.o ListImplementation.o

myProgram.o: myProgram.c StudentInterface.h StudentType.h ListInterface.h ListType.h
    gcc $(OPTIONS) -c myProgram.c

StudentImplementation.o: StudentImplementation.c StudentInterface.h StudentType.h
    gcc $(OPTIONS) -c StudentImplementation.c

ListImplementation.o: ListImplementation.c ListInterface.h ListType.h StudentInterface.h StudentType.h
    gcc $(OPTIONS) -c ListImplementation.c

clean:
    rm *.o a.out

如果你有一个普通的makefile或者没有makefile,那么你想要的命令是

make -B CFLAGS=-DNDEBUG

标准制作配方中没有FLAG变量;每个组件都有自己的变量,因此 CFLAGS 用于 C,CXXFLAGS 用于 C++,LDFLAGS 用于链接器,依此类推。

使用您在问题中提供的 Makefile,您无法更改 make 命令行上的标志。你可以使用

OPTIONS = -DNDEBUG -ansi -pedantic -Wall -Werror

但这意味着每次要更改调试设置时都要编辑 Makefile。

根据我的 Unix makefile 经验,默认标志应该是 CFLAGS,当然除非 FLAG 在您的 makefile 中明确使用。但是不推荐在命令行上定义 CFLAGS,因为它是 overriding a make variable.

编译器调用中是否有任何-DNDEBUG?如果不是,可能是Makefile本身的问题,需要你提供相关数据

你只需要

OPTIONS = -DNDEBUG -ansi -pedantic...

然而,一个更简单的 Makefile 看起来像这样

CFLAGS = -DNDEBUG -ansi -pedantic -Wall -Werror -I.

a.out: myProgram.o StudentImplementation.o ListImplementation.o

clean:
    rm *.o a.out