Что означает char * (int) в C ++? - PullRequest
4 голосов
/ 12 мая 2019

У меня есть следующая строка кода в одном из проектов, над которым я работаю:

char* i2txt(int);

И я не совсем понимаю, что он делает?С моим половинным знанием я пытался заставить его работать с плавающими, поэтому я изменил int на float, но это выдает мне ошибку.

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 ]

3 голосов
/ 12 мая 2019

Это просто объявление функции, которое принимает и 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, произойдет ошибка связи ( Если определение находится в статической библиотеке ).

3 голосов
/ 12 мая 2019

Он объявляет функцию, которая принимает int (по значению) и возвращает точку в char. Учитывая имя (целое число к тексту), указатель почти наверняка на нулевую завершенную последовательность символов, которые являются текстовой версией числа. Указатель будет либо на статическую переменную в функции (что означает, что она не является поточно-ориентированной, и полученный текст должен быть скопирован, если вы хотите сохранить ее), либо на динамически размещаемый массив (в этом случае он должен быть освобожден). ). Функция, возвращающая std::string, была бы намного лучше.

3 голосов
/ 12 мая 2019

Оператор 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 s может быть неявно преобразовано в 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 голосов
/ 12 мая 2019

Это объявляет функцию, принимающую целое число и возвращающую указатель на символ.

Я предполагаю, что ошибка, которую вы получили после изменения, была ошибкой компоновщика, сообщая вам, что она не находит определения для i2txt с параметром float.Это связано с тем, что определение этой функции, которое приводится в другом месте, принимает целочисленный параметр, а не число с плавающей запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...