循环参数的宏

时间:2014-09-04 16:24:33

标签: c++ vector macros c-preprocessor


我想知道为什么将v.size()传递给宏参数会给我一个错误但是如果我将值存储在临时变量中并传递它而不是它有效;

这是我的代码:

#include <stdio.h>
#include <vector>

using namespace std;

#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define REP(i,n) FOR(i,0,n-1)

int main(){

    int n,x;
    vector<int> v;
    scanf("%d", &n);
    REP(i, n){
        scanf("%d", &x);
        printf("Size of Vector = %d\n", v.size());
        int exists = 0;
        REP(j, v.size()){
            // Loop executes even when size = 0
            if (v[j] == x){
                exists = 1;
                break;
            }
         }
        if (!exists)
            v.push_back(x);
    }
    return 0;
 }

然而这有效:

int size = v.size();
REP(j, size){
    if (v[j] == x){
        exists = 1;
        break;
    }
}

3 个答案:

答案 0 :(得分:3)

问题是你的FOR宏正在做b - 1.所以如果b是0,那么无符号(我认为是v.size())你会得到一个非常大的数而不是-1。您应该使用以下宏:

#define FOR(i,a,b) for(int i=a;i<b;++i)
#define REP(i,n) FOR(i,0,n)

答案 1 :(得分:1)

您的代码

 REP(j, v.size()){

将被解释为

for(int j=0;j<=v.size()-1;++j) {

vector :: size()返回无符号整数值。如果大小为零,则v.size()-1生成最大整数值,即j<=v.size()-1始终为真。

答案 2 :(得分:0)

v.size()的类型未签名。如果您延长第REP(j, v.size()){行,您将获得for(int j=0;j<=v.size()-1;++j)。如果v为空,则v.size()-1的结果是v.size()类型的无符号变量可以容纳的最大值。在j<=v.size()-1中,变量j被提升为无符号类型。这导致j没有边界,很容易理解为什么会出现vector subscript out of range错误。