C++ CDT索引器错误,类型DEF在ifdef内

C++ CDT索引器错误,类型DEF在ifdef内,c++,typedef,eclipse-cdt,conditional-compilation,indexer,C++,Typedef,Eclipse Cdt,Conditional Compilation,Indexer,我的索引器有问题。它批评了套接字在方法中的使用: #ifndef TEST_H_ #define TEST_H_ #ifdef linux typedef int SOCKET; #endif class Test { public: void test(const SOCKET src); }; #endif /* TEST_H_ */ 我的eclipse版本是:版本:Luna Service Release 2(4.4.2)构建id:20150219-0600 我的CDT是8

我的索引器有问题。它批评了套接字在方法中的使用:

#ifndef TEST_H_
#define TEST_H_

#ifdef linux
typedef int SOCKET;
#endif

class Test {
public:
    void test(const SOCKET src);
};

#endif /* TEST_H_ */
我的eclipse版本是:版本:Luna Service Release 2(4.4.2)构建id:20150219-0600

我的CDT是8.6.0.201502131403

以下是来自索引器的消息:无法解析类型“SOCKET”

一些事实:

  • “linux”已定义
  • 如果我删除typedef周围的“ifdef”,索引器将不再报告任何错误
尽管如此,代码将使用和不使用ifdef进行编译。但是我想用ifdef解决索引问题。有什么想法吗

问候
Rainer是灰显的ifdef,如下图所示:

如果是这样,那么CDT不知道定义了“linux”符号。要定义它,您有一些选择,具体取决于您的设置

管理品牌 Managed make意味着您允许CDT为您创建make文件

选项1:您是使用GCC的本地linux,那么我怀疑出了什么问题,请提交一个bug

选项2:您正在进行交叉编译,那么这是项目/工作区的设置问题(不幸的是,这里需要更多详细信息)

标准品牌 标准make意味着您正在自己编写makefile(或者其他工具正在编写)

选项1:您没有从EclipseCDT中运行构建,因此CDT不知道您的构建设置是什么。CDT分析运行make的输出,以确定应该设置什么

选项2:您在CDT中运行make,但命令回音被抑制(@on命令)。试着在没有这个的情况下运行make

选项3:您需要告诉CDT已定义的符号。告诉CDT:

  • 打开项目属性(右键单击项目并选择“属性”)
  • 打开“C/C++常规”-“路径和符号”设置页面,选择“符号”选项卡
  • 单击“添加”按钮定义新符号
  • 填写符号的详细信息。在您的例子中,您可能希望Name=linux和Value=1(我在屏幕截图中使用了未知的_符号,因为我的系统上已经定义了linux)。您可能希望通过选中这两个复选框将其应用于所有语言和所有构建配置
  • 反复按OK,直到返回编辑器。您可能会得到一个对话框,提示您重建索引。答应吧

    多亏了乔纳。我使用标准品牌,选项3解决了我的问题。非常好。如果你能接受我的回答,那就太好了。我还有一个额外的问题。我在Eclipse中运行构建,我认为“linux”的定义是因为构建本身可以工作。只有索引器报告问题。那么索引器中没有问题吗?据我所知,索引器找不到定义的“linux”!我如何检查索引器和/或编译器的定义?请在一个新问题中询问,我将很高兴在那里回答。我的愿望是建立关于EclipseCDT的高质量问题和答案,但为了实现这一点,我们需要您提出的每个好问题都以问题的形式结束,而不是隐藏在评论中。经过再三思考,我认为您提出了这个问题。我将修改我的答案,以便能够首先诊断索引器为什么不能正确地看到linux的问题。你能确认操作系统和GCC版本吗。特别是你使用“GCC”或类似“ARM Linux GCC”之类的东西吗?在为你的特定情况整理答案的同时,你可以看看扫描仪发现手册,我的操作系统是OpenSSUE 13.1,64位GCC是C++(SUSELinux)4.8 1 20130909 [ GCC-4G8分支修订版202388 ]编译器是通过Eclipse自动设置的环境变量CXX定义的