在同一个项目中包含<termios.h>和<asm termios.h =“”>

时间:2016-06-08 18:46:41

标签: c++ linux header-files termios

我想要实现的目标:我想为某些baud rate设置自定义tty*值,例如UART - 映射终端。

如何:到目前为止我找到的唯一方法是使用位于struct termios2标题中的<asm/termios>结构(如上所述here,第一个答案)。

到目前为止,我的解决方案运行良好,但现在我需要使用一些函数:

speed_t cfgetispeed(const struct termios *);
int     tcdrain(int);
int     tcflow(int, int);
int     tcflush(int, int);
int     tcgetattr(int, struct termios *);
pid_t   tcgetsid(int);
int     tcsendbreak(int, int);
int     tcsetattr(int, int, struct termios *);

问题是在<asm/termios.h>中没有这样的功能,我需要包含<termios.h>才能使用它们。

问题:如果我包含两个标题(<asm/termios.h><termios.h>),编译器会尖叫关于函数和结构重新声明,他是对的。

如何在不使用某些模糊实践的情况下解决这个问题(比如在命名空间中包装一个标头,如提到的here)?

2 个答案:

答案 0 :(得分:1)

  

如何在不使用某些模糊实践的情况下解决这个问题(比如在命名空间中包装一个标头,如提到的here)?

如果您发现名称空间模糊不清,我不知道您如何称呼它:

#define termios asmtermios
#include <asm/termios.h>
#undef  termios
#include <termios.h>

无论如何,这也让你摆脱了error: redefinition of 'struct termios'

答案 1 :(得分:1)

我遇到了一个类似的问题-想要使用cargo runtermios2TCGETS2等定义的自定义波特率支持,同时仍然使用传统的termios调用。我本能地将termios2内容包装在自己的compilation unit中,没有任何问题。所以我的结构看起来像这样:

serial_driver.c / .h

BOTHER

serial_driver_abr.c / .h

#include <termios.h>
#include <fcntl.h>
#include <dirent.h>

int open_port(int fd, int baudrate, eParitySetting parity, int numStopBits)
{
  if(baudrate_is_non_standard(baudrate)
    setNonStandardBaudRateTermios(fd, baudrate, parity, numStopBits);
  else
    //all the normal tcgetattr/cfsetospeed/tcsetattr
}

int do_other_things(void)
{
  //all the normal tcsendbreak/tcflush/etc things
}

对我来说很好。