应该怎么修改宏定义

eseses455250704 2015-08-26 03:58:02
*******************************
...全文
593 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2015-08-31
  • 打赏
  • 举报
回复
引用 33 楼 eseses455250704 的回复:
[quote=引用 31 楼 adlay 的回复:] 不对啊,你原来的代码怎么通过编译的。。。 你的 printf("\n----------- Begin Unit Test ----------\n"); Test_LinkTable( ); char *result = all_tests(); 也存在变量定义出现在语句之后了的吗
警告怎么消除啊? 哥们[/quote] 你是 64 位的系统吗? 把 “%d" 改成 "%ld" 试试呢
eseses455250704 2015-08-31
  • 打赏
  • 举报
回复
引用 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*)); ^
eseses455250704 2015-08-31
  • 打赏
  • 举报
回复
引用 31 楼 adlay 的回复:
不对啊,你原来的代码怎么通过编译的。。。 你的 printf("\n----------- Begin Unit Test ----------\n"); Test_LinkTable( ); char *result = all_tests(); 也存在变量定义出现在语句之后了的吗
警告怎么消除啊? 哥们
eseses455250704 2015-08-31
  • 打赏
  • 举报
回复
引用 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
www_adintr_com 2015-08-28
  • 打赏
  • 举报
回复
不对啊,你原来的代码怎么通过编译的。。。 你的 printf("\n----------- Begin Unit Test ----------\n"); Test_LinkTable( ); char *result = all_tests(); 也存在变量定义出现在语句之后了的吗
www_adintr_com 2015-08-28
  • 打赏
  • 举报
回复
你用的 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;
}
eseses455250704 2015-08-28
  • 打赏
  • 举报
回复
引用 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
二班的码农 2015-08-27
  • 打赏
  • 举报
回复
#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) 这个应该是!= 楼主 你再试试
eseses455250704 2015-08-27
  • 打赏
  • 举报
回复
引用 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] 有没有别的写法
二班的码农 2015-08-27
  • 打赏
  • 举报
回复
引用 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) 改成这个不行么
赵4老师 2015-08-27
  • 打赏
  • 举报
回复
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George
eseses455250704 2015-08-27
  • 打赏
  • 举报
回复
引用 15 楼 ant2012 的回复:
忘了说了,主函数也得改 char *result = all_tests(); bool result = all_tests(); if (!result) { printf("Error:The test doesn't pass normal"); }
就是宏里面return那里 结束了函数的运行,不再执行下一个语句了 应该怎么改下那里呢
eseses455250704 2015-08-27
  • 打赏
  • 举报
回复
引用 15 楼 ant2012 的回复:
忘了说了,主函数也得改 char *result = all_tests(); bool result = all_tests(); if (!result) { printf("Error:The test doesn't pass normal"); }
宏那里应该怎么改下 不改的话还是老样子啊
二班的码农 2015-08-27
  • 打赏
  • 举报
回复
忘了说了,主函数也得改 char *result = all_tests(); bool result = all_tests(); if (!result) { printf("Error:The test doesn't pass normal"); }
eseses455250704 2015-08-27
  • 打赏
  • 举报
回复
引用 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; }
哥们 这么写也不对啊 编译都出错的?
www_adintr_com 2015-08-27
  • 打赏
  • 举报
回复
在保留测试函数形式的情况下,最简单的例子

#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() 函数调用再包装到宏里面
eseses455250704 2015-08-27
  • 打赏
  • 举报
回复
引用 25 楼 adlay 的回复:
试试 #define tcut_run_test(test) do { char *what = test(); nr_tests++;} while (0) 你要想遇到错误还继续,就不能用一个返回值来返回所有的错误信息,需要用更多的结构来记录每一个测试的运行情况。
具体说下如果用更多的结构来记录每一个测试的运行情况 该怎么写呢
www_adintr_com 2015-08-27
  • 打赏
  • 举报
回复
试试 #define tcut_run_test(test) do { char *what = test(); nr_tests++;} while (0) 你要想遇到错误还继续,就不能用一个返回值来返回所有的错误信息,需要用更多的结构来记录每一个测试的运行情况。
eseses455250704 2015-08-27
  • 打赏
  • 举报
回复
引用 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个 ----------------------------------------
二班的码农 2015-08-27
  • 打赏
  • 举报
回复
编译错误信息是什么
加载更多回复(14)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧