求大神 帮写个宏需要编写一个宏,如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!!娱乐无极限啊
[解决办法]