Tag: 断言

为什么断言失败?

当我尝试使用VC2010调试它时,此代码失败: char frd[32]=”word-list.txt”; FILE *rd=fopen(frd,”r”); if(rd==NULL) { std::cout<<"Coudn't open file\t"<<frd; exit(1); } char readLine[100]; while(fgets(readLine, 100, rd) != NULL) { readLine[strlen(readLine) – 1] = '\0'; char *token = NULL; token = strtok(readLine, " ,"); insert(readLine); } 调试结果 ————————— Microsoft Visual C ++调试库———– 调试断言失败! 程序:… \ documents \ visual studio 2010 \ Projects \ bfa \ […]

可靠地确定数组中的元素数量

每个C程序员都可以使用这个众所周知的宏来确定数组中元素的数量: #define NUM_ELEMS(a) (sizeof(a)/sizeof 0[a]) 这是一个典型的用例: int numbers[] = {2, 3, 5, 7, 11, 13, 17, 19}; printf(“%lu\n”, NUM_ELEMS(numbers)); // 8, as expected 但是,没有什么能阻止程序员意外地传递指针而不是数组: int * pointer = numbers; printf(“%lu\n”, NUM_ELEMS(pointer)); 在我的系统上,这打印2,因为显然,指针是整数的两倍。 我想过如何防止程序员错误地传递指针,我找到了一个解决方案: #define NUM_ELEMS(a) (assert((void*)&(a) == (void*)(a)), (sizeof(a)/sizeof 0[a])) 这是有效的,因为指向数组的指针与指向其第一个元素的指针具有相同的值。 如果改为传递指针,指针将与指向自身的指针进行比较,这几乎总是假的。 (唯一的例外是递归的void指针,也就是指向自身的void指针。我可以忍受它。) 意外地传递指针而不是数组现在在运行时触发错误: Assertion `(void*)&(pointer) == (void*)(pointer)’ failed. 太好了! 现在我有几个问题: 我使用assert作为逗号表达式有效标准C的左操作数吗? 也就是说,标准是否允许我使用assert作为表达式? 对不起,如果这是一个愚蠢的问题:) 可以在编译时以某种方式完成检查吗? […]