Подтвердить что ты не робот

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 и т.д.

4b9b3361

Ответ 1

В Eclipse:

  • щелкните правой кнопкой мыши проект
  • Свойства щелчка
  • Разверните " C/С++ general" элемент в дереве левой руки, щелкнув стрелку (просто щелкнув элемент, он не расширяет субоптимы)
  • В подпозициях выберите " Препроцессор Включить пути, Макросы и т.д."
  • Перейдите на вкладку Провайдеры.
  • Установите флажок " Настройки встроенного компилятора CDT GCC [Shared]".

Edit:

Причина этого в том, что есть куча значений по умолчанию, и определяет, что компилятор молча добавляет за сцену при компиляции. Эти инструкции получают eclipse, чтобы захватить эти иначе молчащие препроцессорные директивы, так что он имеет индекс, который использует те же настройки

Ответ 2

Следующий метод решает ту же проблему, что и я. (на затмении 4.2)

  • Очистите свой проект (ProjectClean)
  • Файлы переиндексации (ProjectC/C++ IndexRebuild)
  • Перестройте свой проект (ProjectBuild 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 );

удалила проблему.