这是整个代码。编译后我得到以下错误:
错误LNK2019:未解析的外部符号“void __cdecl CandyBarFunc(struct CandyBar&,char const *,double,int)”(?CandyBarFunc @@ YAXAAUCandyBar @@ PBDNH @ Z)在函数_wmain中引用
致命错误LNK1120:1未解决 的外部
#include "stdafx.h"
#include <iostream>
using namespace std;
struct CandyBar
{
char name[40];
double weight;
int calories;
};
void CandyBarFunc(CandyBar & astruct, const char * aname = "Millennium Munch", double aweight = 2.85, int acalories = 350);
void CandyBarFunc(const CandyBar & astruct);
int _tmain(int argc, _TCHAR* argv[])
{
CandyBar MyCandyBar;
CandyBarFunc(MyCandyBar, "Hello World Candy Bar", 1.25, 200);
CandyBarFunc(MyCandyBar);
return 0;
}
void CandyBarFunc(CandyBar & astruct, char * aname, double aweight, int acalories)
{
strncpy(astruct.name,aname,40);
astruct.weight = aweight;
astruct.calories = acalories;
}
void CandyBarFunc(const CandyBar & astruct)
{
cout << "Name: " << astruct.name << endl;
cout << "Weight: " << astruct.weight << endl;
cout << "Calories: " << astruct.calories;
}
答案 0 :(得分:3)
由于name
定义为char name[40]
,因此您无法编写试图更改astruct.name = aname
数组地址的name
。但是阵列的地址不能改变。因此错误。
执行此操作:strcpy(astruct.name, aname);
更好的是,将CandyBar
定义为
struct CandyBar
{
std::string name;
double weight;
int calories;
};
现在你可以写:astruct.name = aname;
答案 1 :(得分:1)
你不能写char * aname = "Millenium Falcon"
,因为"Millenium Falcon"
是(const char *)
,是不可修改的内存。如果可以,请更改您的功能签名以接受const char * aname
。或者使用std :: string,毕竟你正在编写C ++。
答案 2 :(得分:1)
您将CandyBar.name定义为数组,这与char指针不同。你必须使用类似strcpy而不是赋值语句。使用STL字符串会更好。
根据您的评论问题,请参阅here。
答案 3 :(得分:1)
使用此:
strncpy(astruct.name, aname, sizeof(astruct.name));
astruct.name[sizeof(astruct.name)-1] = 0;
编辑:并回应你完全改变的问题:
“char * aname”与“const char * aname”不同。你转发声明一个(给出未解析的外部),然后实现另一个,从不调用。
答案 4 :(得分:1)
目前的问题是措辞,缺少的是;在结构CandyBar的结束括号之后。