Eclipse给我无效的参数'候选者是:void * memset(void *,int,?)'虽然我知道args是好的

时间:2012-10-22 23:43:44

标签: eclipse memset

我在eclipse中得到了一个无效的参数错误,尽管我相信我的论点是好的。建议的参数包含'?'我认为这可能表明问题,但我不知道如何解决它。

我尽力复制我在这里看到的例子:
http://www.cplusplus.com/reference/clibrary/cstring/memset/

为了确定我正确使用args。

#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,?)'

可能导致这种情况的原因是什么?那是什么'?'作为第3个arg?

提前致谢!

PS:刚刚注意到我在尝试使用malloc,calloc等操作时遇到了类似的错误。

7 个答案:

答案 0 :(得分:17)

在Eclipse中:

  • 右键单击项目
  • 点击属性
  • 通过单击箭头展开 C / C ++ general 左侧树视图中的项目(仅点击项目本身不会展开子选项)< / LI>
  • 从子选项中选择预处理器包含路径,宏等
  • 点击提供商标签
  • 选中 CDT GCC内置编译器设置[共享] 旁边的框。

编辑:

这个工作的原因是有一堆默认包含并定义编译时编译器静默添加到场景后面。这些指令让eclipse获取这些默认的预处理器指令,以便它自己的索引器使用相同的设置

答案 1 :(得分:2)

以下方法解决了我遇到的同样问题。 (在日食4.2上)

  • 清理您的项目(Project - &gt; Clean
  • 重新索引文件(Project - &gt; C/C++ Index - &gt; Rebuild
  • 重建您的项目(Project - &gt; Build All

答案 2 :(得分:1)

我认为这与Eclipse设置有关,不知何故。

单独使用,该片段使用命令行在Mac OS X 10.7.5上的GCC(G ++)4.7.1下编译:

g++ -O3 -g -Wall -Wextra -c ms.cpp

关于memset()的第三个参数唯一令人惊讶的是它是size_t类型,但是标题应该声明,所以它不应该是一个问题。

如果您正在使用malloc()等,当然您将包括<stdlib.h>。还有空间可以证明您应该使用<cstdio><cstring><cstdlib>,但这不应该停止您编译时出现的代码而不会出错。

答案 3 :(得分:1)

如果您正在使用Visual Studio,则size_t定义为

typedef unsigned __int64    size_t;

在以前版本的Eclipse CDT中,未定义__int64。您可以通过添加到C / C ++ General中来解决该问题 - &gt;路径和符号 - &gt;符号

  • 符号:__ int64
  • 价值:很长

或者您可以升级Eclipse CDT版本

答案 4 :(得分:0)

我一直在使用第三方C ++库进行BeagleBone开发,我尝试了各种可能的方式来包含它(因为预处理器包括,源文件夹,assember包含,库包含,C ++编译器包含,C编译器包括等) 。为我尝试的每一项改变进行修复,重新索引,清洁和构建。我甚至删除了项目,只将.cpp和.h文件复制到一个新项目中。

我终于在我的设置中发现了问题,并按如下方式对其进行了纠正。

右键单击项目&gt;属性&gt; C / C ++ Build&gt;工具链编辑器&gt;当前构建器:&gt;选择 CDT内置生成器

我使用g ++,以获取您的信息。

答案 5 :(得分:0)

我在Eclipse CDT上遇到了类似的问题。但就我而言,问题是我已将using namespace std;语句放在几个标题中。在某些条件组合中,当我包含所有这些头文件时,Eclipse就有这样的行为。

答案 6 :(得分:0)

编译某人的代码时遇到了类似的问题,问题是代码风格。他们用这种方式定义了一些方法:

// ... Inside a class

static void
sleep( u32 ms );

我猜这是GNU风格。只需将声明更改为

即可
static void sleep( u32 ms );

删除了这个问题。