C++函数中未解析的外部链接

Unresolved external link in C++ function

本文关键字:外部 链接 函数 C++      更新时间:2023-10-16

我一直收到以下错误,似乎无法解决:

错误LNK2019:未解析的外部符号";double__cdecl-orderIn(双,双,双)"(?订单输入@@YANNNN@Z)在函数_main 中引用

致命错误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;
}

您声明:

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的地址进行评估并丢弃;对CCD_ 10的地址进行评估并丢弃;则返回CCD_ 11中的值。您可以更改函数以返回void,并完全删除return语句,类似于shippingOut()

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

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

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

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

在这种情况下,结果基本相同,这在很大程度上是巧合,但如果您有值参数或指针参数,或者如果调用没有将全局变量作为引用参数传递,效果会大不相同。

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

您的函数原型是:

double orderIn(double, double, double);

然而,您的实际功能定义是:

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

doubledouble&是不同的类型,因此您需要调整原型或定义。