在我正在从事的项目之一中,我有以下代码行:
char* i2txt(int);
我不完全了解它的作用吗? 凭借半知识,我试图使它与浮点数一起使用,因此我将int更改为浮点数,但这给了我一个错误。
char* i2txt(int);
/*vs*/
char* i2txt(float);
错误消息:
Error LNK2019 unresolved external symbol "char * __cdecl i2txt(float)" (?i2txt@@YAPADM@Z) referenced in function "public: char * __thiscall DapChannel::getDurationTxt(void)" (?getDurationTxt@DapChannel@@QAEPADXZ) PhotoZ DapChannel.obj 1
答案 0 :(得分:3)
这声明了一个接受整数并返回char指针的函数。
我猜您更改它后得到的错误是链接器错误,告诉您它找不到带浮点参数的i2txt
的定义。这是因为在其他地方提供的此函数的定义接受整数参数,而不是浮点数。
答案 1 :(得分:3)
它声明一个接受int(按值)的函数,并将一个点返回给char。给定名称(文本的整数),指针几乎可以肯定是指向以数字结尾的字符的空终止字符序列。指针将指向函数中的静态变量(这意味着它不是线程安全的,并且如果要保存它,则必须复制结果文本)或动态分配的数组(在这种情况下,必须将其释放) )。返回std::string
的函数会更好。
答案 2 :(得分:3)
语句char* i2txt(int);
正向声明一个函数i2txt
,该函数以一个int
作为输入,并返回一个char*
。
如果在声明函数之前使用了函数,则会导致错误:
#include <iostream>
int main() {
foo(); // Error: foo not defined
}
void foo() {
std::cout << "Hello, world!";
}
转发声明基本上指出“此函数尚未定义,但我保证最终会定义它。在上述情况下,它看起来像这样:
#include <iostream>
void foo(); // Forward declaration
int main() {
foo(); // Now we can use it
}
void foo() {
std::cout << "Hello, world!";
}
i2txt(float);
时会出错?这将导致错误,因为突然没有i2txt(int)
函数要调用。由于int
可以隐式转换为float
,因此编译器仍允许其他函数调用i2txt(float)
,但从未提供i2txt(float)
的定义,因此存在链接器错误:
#include <iostream>
char* i2txt(float);
int main() {
std::cout << i2txt(10); // Tries calling i2txt(float)
}
// This provides a definition for i2txt(int), but the linker is still missing a definition for i2txt(float)
char* i2txt(int) {
// ... stuff
}
答案 3 :(得分:3)
它只是一个带有int
参数并返回char*
的函数声明:
// Declaration :
char* i2txt(int);
// Definition :
char* i2txt(int n)
{
// do something
}
但是发生error
是因为存在i2txt
函数的实现,该实现带有一个int
参数,并且在您尝试更改声明时(尤其是如果该实现在静态库中定义) ),它会像下面这样为您提供链接器error
:
错误LNK2019:在...中引用的未解析的外部符号“ char * __cdecl a(float)”(?a @@ YAPADM @ Z)
在正常状态下,如果使用i2txt
值调用float
,则可能会将浮点数强制转换为int,但如果尝试更改i2txt
的声明,则链接错误将会出现( 如果定义在静态库中 )。