Как различать atof символа от входа нулевого [дубликата]

Невозможность связывания с соответствующими библиотеками / объектными файлами или компиляция файлов реализации

Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единицы перевода. Чтобы использовать эти символы, вам необходимо связать эти объектные файлы.

В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.

g++ -o test objectFile1.o objectFile2.o -lLibraryName

Здесь libraryName - это просто имя библиотеки, без добавления к платформе. Так, например, в файлах библиотеки Linux обычно называют libfoo.so, но вы должны писать только -lfoo. В Windows этот же файл можно назвать foo.lib, но вы будете использовать тот же аргумент. Возможно, вам придется добавить каталог, в котором эти файлы можно найти, используя -L‹directory›. Обязательно не записывайте пробел после -l или -L.

Для XCode: добавьте пути поиска заголовка пользователя -> добавьте путь поиска библиотеки -> перетащите фактическую ссылку библиотеки в

В MSVS файлы, добавленные в проект, автоматически связывают их объектные файлы, и будет создан файл lib (в общем использовании). Чтобы использовать символы в отдельном проекте, вам нужно будет добавить файлы lib в параметры проекта. Это делается в разделе Linker свойств проекта в Input -> Additional Dependencies. (путь к файлу lib должен быть добавлен в Linker -> General -> Additional Library Directories). При использовании сторонней библиотеки, которая предоставляется с файлом lib, отказ в этом обычно приводит к ошибке.

Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).

В программировании Windows контрольный знак, который вы не связывали необходимая библиотека состоит в том, что имя неразрешенного символа начинается с __imp_. Посмотрите имя функции в документации, и она должна сказать, какую библиотеку вам нужно использовать. Например, MSDN помещает информацию в поле внизу каждой функции в разделе «Библиотека».

37
задан Jonathan Leffler 31 August 2013 в 05:33
поделиться

4 ответа

Это одна из причин, по которой atoi иногда считается небезопасной. Вместо этого используйте strtol / strtoul. И если вы используете strtonum .

Функция atoi более опасна, чем вы думаете. Стандарт POSIX говорит:

Если значение не может быть представлено, поведение не определено.

Стандарт C99 это также говорит:

7.20.1

Функции atof, atoi, atol и atoll не должны влиять на значение целочисленного выражения errno при ошибке. Если значение результата не может быть представлено, поведение не определено.

33
ответ дан cnicutar 31 August 2018 в 17:45
поделиться

Я использовал

#include <stdlib.h>
using namespace std;

перед основным и не проблема для использования atoi, но будьте осторожны, он не может обнаружить переполнение или неправильные входы. используя strtol немного сложно, проверьте этот для получения дополнительной информации

-3
ответ дан Community 31 August 2018 в 17:45
поделиться
10
ответ дан Jonathan Leffler 31 August 2018 в 17:45
поделиться

Вы не можете.

atoi не может обнаружить ошибки. Если результат не может быть представлен, atoi вызывает неопределенное поведение. Используйте strtol вместо atoi.

Безопасное кодирование CERT советует использовать strtol вместо atoi, читать:

INT06-C. Используйте strtol () или связанную функцию для преобразования токена строки в целое число

6
ответ дан Mat 31 August 2018 в 17:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: