char *(int)在C ++中是什么意思?

时间:2019-05-12 16:47:27

标签: c++ pointers

在我正在从事的项目之一中,我有以下代码行:

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   

4 个答案:

答案 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的声明,则链接错误将会出现( 如果定义在静态库中 )。