首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求大神 帮写个宏解决办法

2013-07-04 
求大神 帮写个宏需要编写一个宏,如MAXMAX(count)当把上面的宏插入循环体或函数中的时候,循环体最多只能执

求大神 帮写个宏
需要编写一个宏,如MAXMAX(count);
当把上面的宏插入循环体或函数中的时候,循环体最多只能执行count次则结束返回0结束过程,并且只能在其作用域内有效,举例如下:


[解决办法]

和二楼一样,显示是不行,再说同一作用域内显然不能重定义。
大括号括住
[解决办法]

和二楼一样,显示是不行,再说同一作用域内显然不能重定义。
大括号括住


大括号括住, 不用 static


[解决办法]
#define MAX_LOOP(cnt)\
static unsigned long MAX_LOOP##__LINE__ = 0;\


if(++MAX_LOOP##__LINE__ == cnt){\
MAX_LOOP##__LINE__ = 0;\
break;\
}



适用于循环,函数可以类似的改。
[解决办法]
更正:

这个数组定多大?怎么初始化/赋值?这个数组的赋值怎么解决自己的多线程并发?
[解决办法]

这个数组定多大?怎么初始化/赋值?这个数组的赋值怎么解决自己的多线程并发?


只需解决有多少个线程的问题,这个是可以获取到的,另外线程数一般不会太多,虽然这是个问题,不过不是很大的问题。初始化很容易,不解释。
[解决办法]
引用:

#include<stdio.h>
#define MAX_LOOP(cnt)\
{static unsigned long MAX_LOOP = 0;\
if(++MAX_LOOP == cnt){\
MAX_LOOP = 0;\
break;\
}}
void func1(int n)
{
int t;
for(t=0;t<n;t++)
{
printf("hello word\n");
MAX_LOOP(10);
}
}
int main()
{
    func1(9);//要输出9次,但最多只能输出10次(因为设置了MAX_LOOP(10);)
    printf("\n");
    func1(20);//要输出20,但最多只能输出10次(因为设置了MAX_LOOP(10);)
    printf("\n");
    return 0;
}

所以func1只输出一个,显然不符合意图的,原因是static变量的结果累加,没有超出阈值时并不会清0


有道理~~~看来是不太可能用一个宏实现了。。。一个宏必须使用静态或全局变量才能保存变量的值,但是要复位这个值就必须知道什么时候跳出了循环,如果不是从宏跳出去,则没有办法知道,也就没有办法复位。。。

坐等大神。
[解决办法]
引用:
把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。

这个可以加一!
[解决办法]
语法糖越甜,编译调试查错越苦!
------解决方案--------------------


为什么非要用宏?
[解决办法]
学习,都是牛人吖,佩服~求大神 帮写个宏解决办法
[解决办法]
求大神 帮写个宏解决办法
别再纠结这些没用的东西了 
[解决办法]
在宏外,while(1)外定义int _MAXMAX_COUNT_,在宏内赋值,使用
[解决办法]
实现这个宏,必须:
1.计数必须和代码上下文相关
2.计数必须线程安全

未考虑线程安全:

template
<int _loop_count,class _base>
class _max_loop_ {
 private:
   static int    _count;

 public:
   _max_loop_ () {
      _count --;
   }

   bool _over() {
   bool b = false;
   if (_count < 0)
   {
  _count = _loop_count;
   }
       return _count == _loop_count;
   }
};

template
<int _loop_count,class _base>
int _max_loop_<_loop_count,_base>::_count = _loop_count;

#define MAXMAX_INML(_loop_count,_cpptime) \
class _max_loop##_cpptime : public _max_loop_<_loop_count,_max_loop##_cpptime> {};_max_loop##_cpptime _loop; if (_loop._over()) break;

#define MAXMAX(_loop_count) MAXMAX_INML(_loop_count,__TIME__)

int _tmain(int argc, _TCHAR* argv[])
{
while(true) {
MAXMAX(100);
printf("loop\n");
}
return 0;
}

线程安全 每个计数通过threadId单独保存在某种hashmap里

而乖乖写代码:
for (i=0;i<count;i++)
{

}

i在调用栈里,天然满足所有要求
所以 没必要写宏
[解决办法]
抱歉 
__TIME__ 或者  __FILE__ 都没办法确定上下文
代码重贴:


#include "stdafx.h"
#include <windows.h>


template
<int _loop_count, class identify, class _base>
class _max_loop_ {
 private:
   static int    _count;

 public:
   _max_loop_ () {
      _count --;
   }

   bool _over() {
   printf("%s \n",__FUNCTION__);
   bool b = false;
   if (_count < 0)
   {
  _count = _loop_count;
   }
       return _count == _loop_count;
   }
};

template
<int _loop_count,class identify, class _base>
int _max_loop_<_loop_count, identify, _base>::_count = _loop_count;

#define MAXMAX(_loop_count,_identify) class _identify {}; class _max_loop : public _max_loop_<_loop_count, _identify ,_max_loop> {};_max_loop _loop; if(_loop._over()) break;

int _tmain(int argc, _TCHAR* argv[])
{
printf("%s \n",__LINE__);

while(1)
{


MAXMAX(10,theCppName);
}
return 0;
}


[解决办法]

和二楼一样,显示是不行,再说同一作用域内显然不能重定义。
大括号括住
用static也不行,如下面的代码,第一次调用输出10次,而第二次调用只输出1次而已:


其实可以这样写,连static都没必要用。你用了static,就增加了一个静态变量,占用内存。只要在某个语句块内临时定义一个变量就OK了。出了这个语句块,变量就消失了。也不在乎外面的变量名是否是一样的,因为会被本语句块的变量给遮盖住。



其实可以这样写,连static都没必要用。你用了static,就增加了一个静态变量,占用内存。只要在某个语句块内临时定义一个变量就OK了。出了这个语句块,变量就消失了。也不在乎外面的变量名是否是一样的,因为会被本语句块的变量给遮盖住。

#define MAXMAX(times_) do{int i=times; while(times_--);}while(0)


使用do{...}while(0)的做法比你们的可要好多了。


看错了,还应该要加个break在后面
#define MAXMAX(times_) do{int i=times; while(times_--);}while(0);break 



[解决办法]
#define __cat_raw(x, y) x##y
#define __cat(x, y) __cat_raw(x, y)

#define MAXMAX(c) static __declspec(thread) int __cat(__MAXMAX__COUNTER__, __LINE__) = c; if (--__cat(__MAXMAX__COUNTER__, __LINE__) <= 0) break;


Oh, my god!!娱乐无极限啊
[解决办法]
求大神 帮写个宏解决办法

热点排行