【问题标题】:Unresolved external link in C++ function [duplicate]C ++函数中未解析的外部链接[重复]
【发布时间】:2014-12-02 03:12:08
【问题描述】:

我不断收到以下错误,似乎无法解决:

错误 LNK2019:函数 _main 中引用的未解析的外部符号“double __cdecl orderIn(double,double,double)”(?orderIn@@YANNNN@Z)

致命错误 LNK1120:1 个未解决的外部问题

我知道我试图通过函数传递变量的方式有问题,但我就是无法得到它。我希望在第一个函数中收集和计算的信息能够通过并被第二个函数使用。试了很多方法都无济于事。

我在这里错过了什么?

谢谢!

#include <iostream>
#include <iomanip>

using namespace std;


double orderIn(double, double, double);
void shippingOut(double, double, double);

double spoolsOrdered, 
    spoolsInStock,
    shipping,  
    total, 
    backordered, 
    charges,
    spoolsShipping;

int main()
{   

orderIn(spoolsOrdered, spoolsInStock, shipping);

shippingOut(spoolsShipping, backordered, total);


return 0;
}//end int main


double orderIn(double &spoolsOrdered, double &spoolsInStock, double &shipping)
{

char extracharge;

//spools ordered
cout << "How many spools would you like to order? ";
cin >> spoolsOrdered;
while (spoolsOrdered < 1)
    {
    cout << "That is not a valid entry ";
    cin >> spoolsOrdered;
    }

//spools in stock
cout << "How many spools are currently in stock? ";
cin >> spoolsInStock;

//extra charges
cout << "Are there any special charges on this order? ";
cin >> extracharge;

//special charges
if ( extracharge == 'Y' || extracharge == 'y')
    {
    cout << "What is the additional charge per spool? ";
    cin >> charges;
    shipping = (10 + charges);
    }
else 
    shipping = 10;
    
return (&spoolsOrdered, &spoolsInStock, shipping);
}

void shippingOut(double spoolsOrdered, double spoolnStock, double shipping)
{

double backordered;
double subTotal;
double totalShipping;
double total;
double spoolsShipping;



if (spoolsOrdered > spoolsInStock)
    {
    backordered=(spoolsOrdered - spoolsInStock);    
    cout << "There are " << spoolsInStock << " spools ready to be shipped./n";
    cout << "The remaining " << backordered <<" are on backorder.";
    spoolsShipping=spoolsInStock;
    }
else
    {
    cout << "All " <<spoolsOrdered << " spools ordered are ready to ship.\n";
    spoolsShipping=spoolsOrdered;
    }

    
    //Product Charges
    subTotal = spoolsShipping * 100;
    cout << "Subtotal: $" << subTotal << endl;
    
    //Shipping Charges
    totalShipping = spoolsOrdered * shipping;
    cout << "S/H Total: $" << totalShipping << endl;
        
    //Total
    total = subTotal + totalShipping;
    cout << "The total of the order ready to ship is: $" << total << endl;

}

【问题讨论】:

    标签: c++ function pass-by-reference


    【解决方案1】:

    您声明:

    double orderIn(double, double, double);
    

    然后使用它。您稍后定义:

    double orderIn(double &spoolsOrdered, double &spoolsInStock, double &shipping)
    

    这是一个不同的功能;参数类型是对double 的引用,而不是简单的double

    修复声明或定义——看起来您确实需要修复声明,因为您想在调用函数中设置变量:

    double orderIn(double &, double &, double &);
    

    您还应该回顾一下为什么有这么多全局变量,以及为什么全局变量名称会被参数遮蔽。尽可能避免使用全局变量。


    a) 当我过去尝试运行它时,我只能通过在 main 之前定义变量来让它工作。所有这些变量应该在哪里声明?

    通常,您将在函数中声明变量(在本例中为main()),然后将变量传递给需要使用它们的函数。有时,全局变量是合适的。所以,我预计:

    int main()
    {   
        double spoolsOrdered = 0.0;
        double spoolsInStock = 0.0;
        double shipping = 0.0;
        double total = 0.0;
        double backordered = 0.0;
        double spoolsShipping = 0.0;
    
        orderIn(spoolsOrdered, spoolsInStock, shipping);
    
        shippingOut(spoolsShipping, backordered, total);
    
        // Use these values?
    
        return 0;
    }
    

    如果您不使用 main() 中的值,为什么要首先传递它们。

    然后我注意到orderIn()shippingOut() 都返回一个double,但是你没有使用这个值。 orderIn() 返回什么?有一个惊喜:

    return (&spoolsOrdered, &spoolsInStock, shipping);
    

    这并不像你认为的那样。逗号是逗号运算符。 spoolsOrdered的地址被评估丢弃; spoolsInStock的地址被评估并丢弃;然后返回shipping 中的值。您可以更改函数以返回 void 并完全删除 return 语句,类似于 shippingOut()

    全局变量charges应该是orderIn()中的局部变量。

    b) 变量和参数之间的关系是什么?

    在函数orderIn(double &amp;spoolsOrdered, double &amp;spoolsInStock, double &amp;shipping)内部,每个参数都隐藏了一个同名的全局变量。由于这是 C++,您仍然可以使用范围运算符 :: 访问全局变量,如下所示:

    ::spoolsOrdered  // The global variable
    spoolsOrdered    // The local reference variable -- a reference to the global
    

    很巧合的是,在这种情况下,它最终几乎是相同的,但是如果你有值参数或指针参数,或者如果调用没有将全局变量作为引用参数传递,那么效果就会完全不同。

    如果您使用 GCC (g++),-Wshadow 选项会报告阴影问题。

    【讨论】:

    • 我在上我的第一堂 C++ 课,感觉我错过了课程中的一些基础知识。 a)当我过去尝试运行它时,我只能通过在 main 之前定义变量来使其工作。所有这些变量应该在哪里声明? b)变量和参数之间的关系是什么?
    • 非常感谢您的提示。我修改了代码如下,现在我唯一的错误是在任何情况下我都不能从 double* 转换为 double。想法?我很确定我的双 & 现在是一致的。 (我应该更新上面的原始条目吗?用当前代码?)
    • 阅读我刚刚对我的回答所做的修订(补充)。如果您需要发布更多代码,请添加而不是替换原始代码。但是尽量少加。请了解如何创建 MCVE (Minimal, Complete, Verifiable Example) 或 SSCCE (Short, Self-Contained, Correct Example) -- 两个名称和链接代表相同的基本思想。
    • 谢谢。我不知道如何缩写我发布的内容。感谢您不仅详细说明我做错了什么,而且还提供了一种更好的寻求帮助的方式。
    【解决方案2】:

    你的函数原型是:

    double orderIn(double, double, double);
    

    但是您的实际函数定义是:

    double orderIn(double &spoolsOrdered, double &spoolsInStock, double &shipping)
    {
    
    }
    

    doubledouble&amp;是不同的类型,需要调整原型或者定义。

    【讨论】:

    • 我将原型改为双 orderIn(double&, double&, double&);但它仍然给了我第二个函数输出的“$ 0”值。我认为我没有得到的是输出将由以下函数使用的变量的基本语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2018-11-19
    • 1970-01-01
    相关资源
    最近更新 更多