28

尽管我相信我的论点是好的,但我在 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, ?) '

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

提前致谢!

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

4

7 回答 7

23

在 Eclipse 中:

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

编辑:

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

于 2014-06-18T16:36:53.973 回答
12

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

  • 清理你的项目 ( Project-> Clean)
  • 重新索引文件 ( Project-> C/C++ Index-> Rebuild)
  • 重建您的项目 ( Project-> Build All)
于 2018-02-13T07:19:03.333 回答
1

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

typedef unsigned __int64    size_t;

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

  • 符号:__int64
  • 值:长长

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

于 2013-12-19T19:19:00.647 回答
1

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

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

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

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

如果你使用malloc()et al,你当然会包括<stdlib.h>。也有争论你应该使用<cstdio>,<cstring>和的空间<cstdlib>,但这不应该阻止你提供的代码编译没有错误。

于 2012-10-23T03:27:46.300 回答
0

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

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

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

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

于 2016-02-13T14:53:49.013 回答
0

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

// ... Inside a class

static void
sleep( u32 ms );

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

static void sleep( u32 ms );

删除了这个问题。

于 2016-03-25T18:35:22.773 回答
0

我对 Eclipse CDT 也有类似的问题。但就我而言,问题是我把using namespace std;声明放在了几个标题中。在某些条件组合中,当我包含所有这些标头时,Eclipse 就会出现这种行为。

于 2016-03-01T20:37:12.370 回答