在C语言结构体中使用assert断言分母非零报错求助
问题解答
为什么结构体里用assert会报错?
结构体的定义块里只能声明成员变量或成员函数,不能直接写执行语句。assert(denom !=0);是一条运行时执行的断言语句,编译器会把它当成成员声明的一部分,自然会报错——因为它期待的是int这类类型说明符,而不是执行代码。
正确的做法
如果你用的是C语言
写一个专门创建Fraction实例的函数,在函数里做断言检查:
#include <stdio.h> #include <assert.h> struct Fraction { int num; int denom; }; struct Fraction create_fraction(int num, int denom) { assert(denom != 0); // 在这里检查分母合法性 struct Fraction f = {num, denom}; return f; } int main() { struct Fraction f = create_fraction(3, 0); // 触发断言报错 return 0; }
如果你用的是C++语言
给结构体添加构造函数,在构造函数里做断言:
#include <cstdio> #include <cassert> struct Fraction { int num; int denom; // 构造函数中检查分母 Fraction(int n, int d) : num(n), denom(d) { assert(d != 0); } }; int main() { Fraction f(3, 0); // 触发断言报错 return 0; }
为什么main里用assert没问题?
main是函数体,函数内部属于执行代码区域,允许直接写assert这类执行语句,所以编译器不会报错。
内容的提问来源于stack exchange,提问作者gunslinger
相关产品推荐
相关产品推荐

