1

我一直在努力寻找答案并让它工作一段时间,所以我想我会在这里检查。我正在尝试通过引用传递指向 long 的指针。我使用的语法是:

int Hex2Loong(long*& bytebuff, int& len, const std::string Hexbuff);

每当我尝试声明函数时都会出现错误。令人惊讶的是,定义本身似乎没有问题。我int*&Hex2Intfcn 中使用与 a 相同的语法,并且没有问题。任何想法我搞砸了什么?

我得到的错误是: 错误:在传递 Hex2Loong(long int*&,int &,const std::string); 的参数 1 中

在相关的说明中,如果我有一个unsigned long *我认为没有办法转换它,所以我可以将它传递给Hex2Loong函数,对吗?我将不得不创建临时long * 变量并传递给它们?

Ty 任何答案,Drf

编辑:嗯好的,所以回答一些评论。我传递了一个引用,因为该函数将一个可能很长的十六进制字符串转换为一个 long 数组。(即认为 2^1000 左右的数字写为十六进制字符串),我需要将数字作为长数组传回(我可能会将其重写为无符号长整数,因为没有强制转换使其很麻烦)。

HexString 被声明为 const ,因为它应该是(不应仅修改为只读)。

最后你是对的,错误与声明无关,而是与用法有关。我试图通过(long *) num1num1 所在的位置的事实把unsigned long *一切都搞砸了。我仍然不明白为什么错误出现在头文件中,而不仅仅是我实际使用错误参数调用函数的地方。

Edit2:哦,我刚刚意识到您所说的传递是什么意思const std::string&。当然,你是完全正确的。我也会改变它。这是我用java写太多的东西。我没有意识到字符串实际上会被复制。

4

1 回答 1

2

您应该可以通过以下方式调用该函数:

long lvar;
long *plvar = &lvar;
int rc = Hex2Loong (plvar, some_int, some_string);

不能做的是传递 long 的地址,因为你需要一个真正的参考。换句话说,不要尝试:

long lvar;
int rc = Hex2Loong (&lvar, some_int, some_string);

请参阅以下示例代码:

void Fn (long * &p1) {}

int main (void) {
    long lvar;
    long *plvar = &lvar;
    Fn (plvar);
    //Fn (&lvar);
    return 0;
}

这可以编译,但是当您取消注释该&lvar行时会抱怨。


关于您的第二个问题,不,您需要一个可以作为参考传递的实际变量,仅仅是因为该函数可能会尝试更改它。因此,您需要在某处制作临时副本。

但是,请记住,除非您确实需要更改要传入的变量的值(以便此类更改反映在调用代码中),否则无需传递引用。您可以按值传递它并在函数中使用该值。

如果您这样做(即,如果您不需要更改它),则可以在函数调用中使用&lvar或使用临时对象。(long*)(unsigned_long_ptr_variable)

于 2013-01-29T06:01:20.187 回答