C 我可以让#Pragma unroll接受宏/表达式而不是普通数字吗?

C 我可以让#Pragma unroll接受宏/表达式而不是普通数字吗?,c,cuda,pragma,nvcc,loop-unrolling,C,Cuda,Pragma,Nvcc,Loop Unrolling,我试图告诉我的编译器使用#pragma unroll为我展开一个循环。但是,迭代次数由编译时变量决定,因此循环需要展开那么多次。像这样: #define ITEMS 4 #pragma unroll (ITEMS + 1) for (unsigned int ii = 0; ii <= ITEMS; ++ii) /* do something */; #定义项目4 #杂注展开(项目+1) 对于(unsigned int ii=0;ii您可以用另一种方法: 注意:刚刚注意到丹尼

我试图告诉我的编译器使用
#pragma unroll
为我展开一个循环。但是,迭代次数由编译时变量决定,因此循环需要展开那么多次。像这样:

#define ITEMS 4

#pragma unroll (ITEMS + 1)
for (unsigned int ii = 0; ii <= ITEMS; ++ii) 
    /* do something */;
#定义项目4
#杂注展开(项目+1)

对于(unsigned int ii=0;ii您可以用另一种方法:

注意:刚刚注意到丹尼尔·菲舍尔的评论,在我面前,它暗示了完全相同的情况

#define ITEMS_PLUS_ONE 5
#define ITEMS (ITEMS_PLUS_ONE - 1)
问题是预处理器不做数学运算。它只做复制和粘贴。
当您编写
#定义项目_+u一(项目+1)
时,
展开
将替换为
(4+1)
,而不是
5

一旦这到达编译器,就不重要了。即使没有优化,计算也会在编译过程中完成,
(4+1)
5
完全相同

但是在您的编译器中,
#pragma unroll
在编译之前进行处理,并且需要简单的数字。

它是否可以与
#定义项5
#pragma unroll ITEMS
,然后为(…,ii
?是的,这会起作用,除了在我的代码中,
项在很多地方都被使用,而且将其定义为一个太多会很奇怪。我还尝试了
#定义项加上一个(项+1)
但这也给出了同样的“额外字符”警告。
#定义项目加上一个5
#定义项目(项目加上一个-1)
?(如果有效,丑陋的解决方法总比没有好。)哈哈,这是一个有趣的方法。是的,这确实有效,但不是那么优雅而有效的解决方法。:-)我现在要处理这个问题。但我想我正在寻找一个更一般的答案,如果有另一个技巧让编译器读取这个pragma中的表达式的话。是的,一个更好的解决方案肯定会很好。但是我不知道如何让预处理器计算
ITEMS+1
,这样pragma就可以得到它想要的单个整数,所以丑陋的解决方法是我能提供的最好的方法。这很有意义,谢谢。换言之:没有办法以非循环的方式来做这件事,因为预处理器不能做数学运算,对吗?@Jelle,对。有些编译器接受带有表达式的
#pragma unroll
,而您的编译器不接受。既然没有,你就卡住了——预处理器肯定不能做数学运算。