对于#include,G ++似乎忽略了#ifdef

时间:2016-05-23 13:43:30

标签: c++ gcc g++

环境 Ubuntu 16.04 G ++ 5.3.1

我有一个头文件,其中包含一个不同的.h文件,具体取决于平台:

#ifdef _WIN32 
#include "curses.h"
#else
#include <ncurses.h>
#endif

这在Windows中工作正常但在Ubuntu中我得到有关curses.h文件的错误:

In file included from /usr/include/unctrl.h:54:0,
                 from /usr/include/curses.h:1694,
                 from headers/command_window.h:8,
                 from command_window.cpp:1:
headers/curses.h:900:19: error: macro "clear" passed 1 arguments, but takes just 0
int     clear(void);

编译时使用:

g++  -g -lncurses -std=c++11  -Iheaders  -c -o command_window.o command_window.cpp

为什么headers / curses.h,这是PDCurses的Windows特定文件?这里有什么?

2 个答案:

答案 0 :(得分:4)

/usr/include/unctrl.h包含以下行:

#include <curses.h>

由于您已告诉编译器在headers/文件夹中查找带有-Iheaders标志的头文件,编译器会在该文件夹中选择curses.h

所以你需要删除-Iheaders标志(例如使用#include“headers / header_name.h”)或者你需要重命名你的headers/curses.h以免与/ usr / include / curses冲突.H

答案 1 :(得分:2)

在您的g ++版本中,-I选项不是将特定于应用程序的头文件(系统头中#include找不到的头文件)添加到搜索路径的正确方法(这种变化也让我感到惊讶)。

相反,您应该使用-iquote headers

请参阅此答案:How to tell g++ compiler where to search for include files?和此official documentation