Eclipse дает мне недопустимые аргументы. Кандидаты: void * memset (void *, int,?) ', Хотя я знаю, что аргументы хороши
Я получаю неверную ошибку аргументов в eclipse, хотя я уверен, что мои аргументы хороши. Предлагаемые аргументы содержат '?' который, я думаю, может указывать на проблему, хотя я не знаю, как ее исправить.
Я сделал все возможное, чтобы скопировать пример, который я увидел здесь:
http://www.cplusplus.com/reference/clibrary/cstring/memset/
Чтобы быть уверенным, что я правильно понимаю аргументы.
#include <stdio.h>
#include <string.h>
void foo()
{
char str[] = "why oh why does my IDE give me errors when I know my args are good?";
memset(str, '-', 4);
puts(str);
}
Eclipse дает мне следующую ошибку в строке memset:
Недопустимые аргументы. Кандидаты: void * memset (void *, int,?) '
Что может быть причиной этого? И что с этим? как третий arg?
Спасибо заранее!
PS: Я заметил, что получаю подобные ошибки при попытке использовать такие операции, как malloc, calloc и т.д.
Ответы
Ответ 1
В Eclipse:
- щелкните правой кнопкой мыши проект
- Свойства щелчка
- Разверните " C/С++ general" элемент в дереве левой руки, щелкнув стрелку (просто щелкнув элемент, он не расширяет субоптимы)
- В подпозициях выберите " Препроцессор Включить пути, Макросы и т.д."
- Перейдите на вкладку Провайдеры.
- Установите флажок " Настройки встроенного компилятора CDT GCC [Shared]".
Edit:
Причина этого в том, что есть куча значений по умолчанию, и определяет, что компилятор молча добавляет за сцену при компиляции. Эти инструкции получают eclipse, чтобы захватить эти иначе молчащие препроцессорные директивы, так что он имеет индекс, который использует те же настройки
Ответ 2
Следующий метод решает ту же проблему, что и я. (на затмении 4.2)
- Очистите свой проект (
Project
→ Clean
)
- Файлы переиндексации (
Project
→ C/C++ Index
→ Rebuild
)
- Перестройте свой проект (
Project
→ Build All
)
Ответ 3
Я думаю, что это как-то связано с вашей настройкой Eclipse.
Взятый отдельно, этот фрагмент компилируется под GCC (g++) 4.7.1 в Mac OS X 10.7.5 с командной строкой:
g++ -O3 -g -Wall -Wextra -c ms.cpp
Единственное удивительное в третьем аргументе memset()
заключается в том, что оно имеет тип size_t
, но заголовки должны объявлять это, поэтому это не должно быть проблемой.
Если вы используете malloc()
et al, вы будете включать <stdlib.h>
, конечно. Существует также возможность утверждать, что вы должны использовать <cstdio>
, <cstring>
и <cstdlib>
, но это не должно останавливать код, который вы представили, от компиляции без ошибок.
Ответ 4
Если вы работаете с Visual Studio, size_t определяется как
typedef unsigned __int64 size_t;
В предыдущих версиях CDT Eclipse __int64 не определялся. Вы можете исправить эту проблему, добавив в C/С++ General → Paths and Symbols → Symbols
- Символ: __int64
- Значение: long long
Или вы можете обновить версию Eclipse CDT
Ответ 5
Я использую стороннюю библиотеку С++ для разработки BeagleBone, и я старался всячески ее включать (в качестве препроцессора, исходной папки, участника, включая библиотеку, компилятор С++, включая компилятор C и т.д.). Refreshen, reindex, чистый и построенный для каждого изменения, которое я пытался. Я даже удалил проект и скопировал только файлы .cpp и .h в новый проект.
Наконец-то я нашел проблему в своей настройке и исправил ее следующим образом.
Щелкните правой кнопкой мыши проект > Свойствa > C/С++ Build > Редактор цепочки инструментов > Текущий Builder: > Выберите Внутренний строитель CDT
Я использую g++ для вашей информации.
Ответ 6
У меня была аналогичная проблема с CDT Eclipse. Но в моем случае дело в том, что я поставил оператор using namespace std;
в несколько заголовков. И в некоторой комбинации условий, когда я включил все эти заголовки, Eclipse обладало таким поведением.
Ответ 7
У меня была аналогичная проблема при компиляции кода, и проблема была в стиле кода. Они определили некоторые методы таким образом:
// ... Inside a class
static void
sleep( u32 ms );
Я предполагаю, что это стиль GNU. Просто изменив объявление на
static void sleep( u32 ms );
удалила проблему.