user-0 提问: 应该怎么修改宏定义 

回复:
user: user-1
content: 引用 33 楼 eseses455250704 的回复:[quote=引用 31 楼 adlay 的回复:] 不对啊，你原来的代码怎么通过编译的。。。 你的 printf("\n----------- Begin Unit Test ----------\n"); Test_LinkTable( ); char *result = all_tests(); 也存在变量定义出现在语句之后了的吗     警告怎么消除啊？ 哥们[/quote]  你是 64 位的系统吗？ 把 “%d" 改成 "%ld" 试试呢

user: user-0
content: 引用 30 楼 adlay 的回复:你用的 VC6 吗？ main 改成这样吧  int main(int argc, char **argv) {     int passed = 0;     int failed = 0;     int i = 0;           BEGIN_TEST         test_replace(),         test_remove()     END_TEST       printf("\n----------- Begin Unit Test ----------\n");     printf("Tests run: %d\n", sizeof(testResults) / sizeof(char*));       for(i = 0; i < sizeof(testResults) / sizeof(char*); ++i)     {         if(testResults[i])         {             printf("TEST %d Error: %s\n", i, testResults[i]);             ++passed;         }         else         {             ++failed;             printf("TEST %d Passed", i);         }     }       printf("\n------------End Unit Test -------------\n");     printf("Passed: %d 个 \n",passed);     printf("Failed: %d 个 \n",failed);     printf("\n----------------------------------------\n");     return 0; }     谢谢您   现在想消除这个警告  怎么改正下呢  warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]      printf("Tests run: %d\n", sizeof(testResults) / sizeof(char*));      ^

user: user-0
content: 引用 31 楼 adlay 的回复:不对啊，你原来的代码怎么通过编译的。。。 你的 printf("\n----------- Begin Unit Test ----------\n"); Test_LinkTable( ); char *result = all_tests(); 也存在变量定义出现在语句之后了的吗     警告怎么消除啊？ 哥们

user: user-0
content: 引用 31 楼 adlay 的回复:不对啊，你原来的代码怎么通过编译的。。。 你的 printf("\n----------- Begin Unit Test ----------\n"); Test_LinkTable( ); char *result = all_tests(); 也存在变量定义出现在语句之后了的吗    没有  用的gcc  照着你给我说的又编译了一下 看看还是有点警告和错误 UnitTest.c:188:1: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]  printf("Tests run: %d\n", sizeof(testResults) / sizeof(char*));  ^ UnitTest.c:206:1: error: expected declaration or statement at end of input  }  ^ make: *** [UnitTest.o] 错误 1

user: user-1
content: 不对啊，你原来的代码怎么通过编译的。。。 你的 printf("\n----------- Begin Unit Test ----------\n"); Test_LinkTable( ); char *result = all_tests(); 也存在变量定义出现在语句之后了的吗

user: user-1
content: 你用的 VC6 吗？ main 改成这样吧  int main(int argc, char **argv) {     int passed = 0;     int failed = 0;     int i = 0;           BEGIN_TEST         test_replace(),         test_remove()     END_TEST       printf("\n----------- Begin Unit Test ----------\n");     printf("Tests run: %d\n", sizeof(testResults) / sizeof(char*));       for(i = 0; i < sizeof(testResults) / sizeof(char*); ++i)     {         if(testResults[i])         {             printf("TEST %d Error: %s\n", i, testResults[i]);             ++passed;         }         else         {             ++failed;             printf("TEST %d Passed", i);         }     }       printf("\n------------End Unit Test -------------\n");     printf("Passed: %d 个 \n",passed);     printf("Failed: %d 个 \n",failed);     printf("\n----------------------------------------\n");     return 0; }

user: user-0
content: 引用 27 楼 adlay 的回复:在保留测试函数形式的情况下，最简单的例子  #include <stdio.h>  #define tcut_assert(what, test) do { if (!(test)) return what;} while (0)   static char * test_replace() { 	int number4 = 2; 	tcut_assert("error, number4 != 1", number4 == 1); 	return 0; }   static char * test_remove() { 	int number5 = 1; 	tcut_assert("error, number5 != 1", number5 == 1); 	return 0; }   //static char * all_tests() //{ //	tcut_run_test(test_replace); //	tcut_run_test(test_remove); //	return 0; //}  #define BEGIN_TEST  char* testResults[] = { #define END_TEST };    int main(int argc, char **argv) { 	printf("\n----------- Begin Unit Test ----------\n"); 	 	BEGIN_TEST 		test_replace(), 		test_remove() 	END_TEST   	int passed = 0; 	int failed = 0;  	printf("Tests run: %d\n", sizeof(testResults) / sizeof(char*));  	for(int i = 0; i < sizeof(testResults) / sizeof(char*); ++i) 	{ 		if(testResults[i]) 		{ 			printf("TEST %d Error: %s\n", i, testResults[i]); 			++passed; 		} 		else 		{ 			++failed; 			printf("TEST %d Passed", i); 		} 	}  	printf("\n------------End Unit Test -------------\n"); 	printf("Passed: %d 个 \n",passed); 	printf("Failed: %d 个 \n",failed); 	printf("\n----------------------------------------\n"); 	return 0; }    如果要收集更多的信息，比如打印出哪个测试函数出错等，可以 char* 数组改成一个包含更多信息的结构数组，吧 test_replace() 函数调用再包装到宏里面        拿着您写的这个   编译之后为什么好多错误，怎么消除这些错误啊？   UnitTest.c: In function ‘main’: UnitTest.c:177:13: error: parameter ‘testResults’ is initialized              BEGIN_TEST              ^ UnitTest.c:179:13: warning: initialization from incompatible pointer type [enabled by default]              test_constains()              ^ UnitTest.c:179:13: warning: (near initialization for ‘testResults’) [enabled by default] UnitTest.c:179:13: error: expected ‘}’ before ‘test_constains’ UnitTest.c:185:13: error: parameter ‘passed’ is initialized              int passed = 0;              ^ UnitTest.c:186:13: error: parameter ‘failed’ is initialized              int failed = 0;              ^ UnitTest.c:187:13: error: expected declaration specifiers before ‘printf’              printf("Tests run: %d\n", sizeof(testResults) / sizeof(char*));              ^ UnitTest.c:188:13: error: expected declaration specifiers before ‘for’              for(int i = 0; i < sizeof(testResults) / sizeof(char*); ++i;)              ^ UnitTest.c:188:28: error: expected declaration specifiers before ‘i’              for(int i = 0; i < sizeof(testResults) / sizeof(char*); ++i;)                             ^ UnitTest.c:188:69: error: expected declaration specifiers before ‘++’ token              for(int i = 0; i < sizeof(testResults) / sizeof(char*); ++i;)                                                                      ^ UnitTest.c:188:73: error: expected declaration specifiers before ‘)’ token              for(int i = 0; i < sizeof(testResults) / sizeof(char*); ++i;)                                                                          ^ UnitTest.c:176:17: error: old-style parameter declarations in prototyped function definition              int main(int argc, char **argv)                  ^ UnitTest.c:205:1: error: expected ‘{’ at end of input  }  ^ UnitTest.c: In function ‘main’: UnitTest.c:205:1: error: expected declaration or statement at end of input make: *** [UnitTest.o] 错误 1

user: user-2
content: #define tcut_assert(what, test) do { if (!(test)) {printf("%s\n", what); return what;}} while (0) } 少了一个;  抱歉  #define tcut_run_test(test) do { char *what = test(); nr_tests++; if (what != 0) mark = false; } while (0） 这个应该是！=  楼主 你再试试

user: user-0
content: 引用 19 楼 ant2012 的回复:[quote=引用 17 楼 eseses455250704 的回复:] [quote=引用 15 楼 ant2012 的回复:] 忘了说了，主函数也得改 char *result = all_tests(); bool result = all_tests(); if (!result) { printf("Error:The test doesn't pass normal"); }   就是宏里面return那里  结束了函数的运行，不再执行下一个语句了   应该怎么改下那里呢[/quote]  #define tcut_assert(what, test) do { if (!(test)) {printf("%s\n", what); return what}} while (0) } #define tcut_run_test(test) do { char *what = test(); nr_tests++; if (what == 0) mark = false; } while (0） 改成这个不行么[/quote]    这个不行啊  我照着你的改了 不能运行   哥们   就是宏里面return那里  结束了函数的运行，不再执行下一个语句了   应该怎么改下那里呢[/quote]   有没有别的写法

user: user-2
content: 引用 17 楼 eseses455250704 的回复:[quote=引用 15 楼 ant2012 的回复:] 忘了说了，主函数也得改 char *result = all_tests(); bool result = all_tests(); if (!result) { printf("Error:The test doesn't pass normal"); }   就是宏里面return那里  结束了函数的运行，不再执行下一个语句了   应该怎么改下那里呢[/quote]  #define tcut_assert(what, test) do { if (!(test)) {printf("%s\n", what); return what}} while (0) } #define tcut_run_test(test) do { char *what = test(); nr_tests++; if (what == 0) mark = false; } while (0） 改成这个不行么

user: user-3
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-0
content: 引用 15 楼 ant2012 的回复:忘了说了，主函数也得改 char *result = all_tests(); bool result = all_tests(); if (!result) { printf("Error:The test doesn't pass normal"); }   就是宏里面return那里  结束了函数的运行，不再执行下一个语句了   应该怎么改下那里呢

user: user-0
content: 引用 15 楼 ant2012 的回复:忘了说了，主函数也得改 char *result = all_tests(); bool result = all_tests(); if (!result) { printf("Error:The test doesn't pass normal"); } 宏那里应该怎么改下  不改的话还是老样子啊

user: user-2
content: 忘了说了，主函数也得改 char *result = all_tests(); bool result = all_tests(); if (!result) { printf("Error:The test doesn't pass normal"); }

user: user-0
content: 引用 11 楼 ant2012 的回复:错了，将 static char * all_tests() {  tcut_run_test(test_replace); tcut_run_test(test_remove); return 0; } 改成 bool all_tests() {  tcut_run_test(test_replace); tcut_run_test(test_remove); return 0; }          哥们  这么写也不对啊  编译都出错的？

user: user-1
content: 在保留测试函数形式的情况下，最简单的例子  #include <stdio.h>  #define tcut_assert(what, test) do { if (!(test)) return what;} while (0)   static char * test_replace() { 	int number4 = 2; 	tcut_assert("error, number4 != 1", number4 == 1); 	return 0; }   static char * test_remove() { 	int number5 = 1; 	tcut_assert("error, number5 != 1", number5 == 1); 	return 0; }   //static char * all_tests() //{ //	tcut_run_test(test_replace); //	tcut_run_test(test_remove); //	return 0; //}  #define BEGIN_TEST  char* testResults[] = { #define END_TEST };    int main(int argc, char **argv) { 	printf("\n----------- Begin Unit Test ----------\n"); 	 	BEGIN_TEST 		test_replace(), 		test_remove() 	END_TEST   	int passed = 0; 	int failed = 0;  	printf("Tests run: %d\n", sizeof(testResults) / sizeof(char*));  	for(int i = 0; i < sizeof(testResults) / sizeof(char*); ++i) 	{ 		if(testResults[i]) 		{ 			printf("TEST %d Error: %s\n", i, testResults[i]); 			++passed; 		} 		else 		{ 			++failed; 			printf("TEST %d Passed", i); 		} 	}  	printf("\n------------End Unit Test -------------\n"); 	printf("Passed: %d 个 \n",passed); 	printf("Failed: %d 个 \n",failed); 	printf("\n----------------------------------------\n"); 	return 0; }    如果要收集更多的信息，比如打印出哪个测试函数出错等，可以 char* 数组改成一个包含更多信息的结构数组，吧 test_replace() 函数调用再包装到宏里面

user: user-0
content: 引用 25 楼 adlay 的回复:试试  #define tcut_run_test(test) do { char *what = test(); nr_tests++;} while (0）  你要想遇到错误还继续，就不能用一个返回值来返回所有的错误信息，需要用更多的结构来记录每一个测试的运行情况。  具体说下如果用更多的结构来记录每一个测试的运行情况  该怎么写呢

user: user-1
content: 试试  #define tcut_run_test(test) do { char *what = test(); nr_tests++;} while (0）  你要想遇到错误还继续，就不能用一个返回值来返回所有的错误信息，需要用更多的结构来记录每一个测试的运行情况。

user: user-0
content: 引用 23 楼 ant2012 的回复:编译错误信息是什么 我得出这样的结果 是这样    Tests run: 5 error, number4 != 1 Error:The test doesn't pass normal ------------End Unit Test ------------- Passed: 4 个  Failed: 1 个  编译过了  但是发现没有执行第6个函数 因为第五个就return了    怎么写能把第六个也执行了呢？  就是passed变为5个 ----------------------------------------

user: user-2
content: 编译错误信息是什么