【问题标题】:Eclipse giving me Invalid arguments ' Candidates are: void * memset(void *, int, ?) ' though I know the args are goodEclipse 给我 Invalid arguments ' Candidates are: void * memset(void *, int, ?)' 虽然我知道 args 是好的
【发布时间】:2012-10-12 20:42:17
【问题描述】:

我在 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 行上给我以下错误:

Invalid arguments ' 候选者是:void * memset(void *, int, ?) '

这可能是什么原因造成的?那是怎么回事?作为第三个参数?

提前致谢!

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

【问题讨论】:

  • 如果这个警告太烦人,你可以禁用它:项目Preferences -&gt; C/C++ General -&gt; Code Analysis -&gt; Syntax and Semantec Errors,并取消选中Invalid arguments
  • @Danijel - 但这有副作用,请参阅this

标签: eclipse memset


【解决方案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() 等,当然您将包括&lt;stdlib.h&gt;。还有人争论说您应该使用&lt;cstdio&gt;&lt;cstring&gt;&lt;cstdlib&gt;,但这不应该阻止您提供的代码无错误地编译。

【讨论】:

    【解决方案2】:

    如果您使用的是 Visual Studio,则 size_t 定义为

    typedef unsigned __int64    size_t;
    

    在早期版本的 Eclipse CDT 中,没有定义 __int64。您可以通过添加到 C/C++ General -> Paths and Symbols -> Symbols

    来解决这个问题
    • 符号:__int64
    • 值:长长

    或者您可以升级您的 Eclipse CDT 版本

    【讨论】:

      【解决方案3】:

      在 Eclipse 中:

      • 右键单击项目
      • 点击属性
      • "C/C++ 常规"通过单击箭头在左侧树视图中展开项目,(仅单击项目本身不会展开子选项)
      • 从子选项中选择"预处理器包括路径、宏等"
      • 点击Providers标签
      • 选中CDT GCC 内置编译器设置[共享]”旁边的框

      编辑:

      这样做的原因是有一堆默认包含和定义,编译器会在您编译时默默地添加到幕后。这些指令让 eclipse 获取这些原本沉默的预处理器指令,以便它自己的索引器使用相同的设置

      【讨论】:

      • 虽然这对我的 C 项目有帮助,但对 C++ 项目没有帮助,是否应该有“CDT G++ 内置编译器设置 [共享]”?
      • 这在 C++ 项目中对我有用。谁能解释一下为什么会这样?
      • 有一堆默认包含和定义,编译器在编译时会在后台默默添加。这些指令让 eclipse 获取这些原本沉默的预处理器指令,以便它自己的索引器使用相同的设置。
      • 我在选中该复选框时看到了错误消息。我必须项目 -> 属性 -> C/C++ 常规 -> 代码分析 -> 使用项目设置 -> 语法和语义错误(取消选中)。当然,这样做的基本操作与您的建议不同(不检查那些潜在错误与发现它们不是错误),但错误检测到的错误已经消失。
      • 在另一个 C++ 项目中这对我有用,谁知道与我大约 9 个月前看到的不同。
      【解决方案4】:

      我一直在使用第 3 方 C++ 库进行 BeagleBone 开发,并尝试了所有可能的方式来包含它(如预处理器包含、源文件夹、汇编包含、库包含、C++ 编译器包含、C 编译器包含等)。为我尝试的每一个更改刷新、重新索引、清理和构建。我什至删除了项目,只将 .cpp 和 .h 文件复制到了一个新项目中。

      我终于在我的设置中发现了问题,并纠正了如下。

      右击项目>属性>C/C++构建>工具链编辑器>当前构建器:>选择CDT内部构建器

      我正在使用 g++,供您参考。

      【讨论】:

        【解决方案5】:

        Eclipse CDT 也有类似的问题。但就我而言,问题是我将using namespace std; 语句放在了几个标题中。在某些情况下,当我包含所有这些标头时,Eclipse 就会出现这种行为。

        【讨论】:

          【解决方案6】:

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

          // ... Inside a class
          
          static void
          sleep( u32 ms );
          

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

          static void sleep( u32 ms );
          

          删除了问题。

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

            • 有时我会忘记这是一个潜在的 Eclipse '问题',还是仅仅是一个索引问题...... 哦!碰巧对我来说是一个索引。谢谢。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-12
            • 1970-01-01
            相关资源
            最近更新 更多