0

我可能有一个愚蠢的问题,但没有任何问题是愚蠢的,我会问它......让我们想象一下我有文件matrix.hppmatrix.cpp. 在这些文件中,我assert(...)用来确保遵守某些条件。我编译这个文件并得到一个matrix.o文件。现在我将matrix.o在许多不同的程序中使用这个文件,其中一些只是测试并且需要检查assert(...)条件,其他是不需要这些检查的工作程序。

我的问题是:我可以在matrix.o没有-DNDEBUG标志的情况下编译吗,因此通常assert(...)会检查条件。但是当我为不需要检查的程序链接 .o 文件时,我添加了这个标志而不重新编译matrix.o文件。

更准确地说,这会做我想要的:

# the test program with the "assert(..)" checks    
test:test.o matrix.o
    gcc -o $@ $^
test.o:test.cpp matrix.hpp
    gcc -c $^

# the real program without the "assert(..)" checks
prog:prog.o matrix.o
    gcc -o $@ $^ -DNDEBUG
prog.o:prog.cpp matrix.hpp
    gcc -c -DNDEBUG $^

# the matrix.o that can be either checked or not if the -DNDEBUG flag
# is given when the .o files are linked
matrix.o:matrix.cpp matrix.hpp
    gcc -c $^

好的,谢谢你的回答!所以我不能简单地使用标志-DNDEBUG。如果每次我在我添加的矩阵文件中使用“assert(...)”怎么办:

#ifdef CHECK
assert(...) 
#endif

现在当我编译“测试”程序时,我使用 CHECK 标志而不是“prog”程序?估计也行不通...

4

2 回答 2

0

简短的回答是否定的。根据您的具体情况,您可能会采用一些巧妙的技巧(例如,链接到不同的“断言失败”函数)。

您是否考虑过抛出异常而不是断言?然后,“prog”和“test”可以采用不同的方法来处理它。

于 2013-06-05T08:34:53.540 回答
0

不,不是 GCC。我看到两个选项:

  1. 编译两个版本matrix.o并将适当的版本链接到每个程序中,或者
  2. 替换assert为引发异常的手动检查。

即使在非测试程序中,后一种选项显然也会产生一些运行时成本,因此请谨慎使用(不要在内部循环中)。

于 2013-06-05T08:35:46.693 回答