相关疑难解决方法(0)

是否可以在命名空间中放置标准的纯C头#include指令?

可能重复:
在命名空间块中包装#include是个好主意吗?

log在全局命名空间(::log)中有一个带有类的项目.

因此,自然地,之后#include <cmath>,编译器在每次尝试实例化我的日志类的对象时都会给出错误消息,因为<cmath>使用许多三字母方法污染全局命名空间,其中一个是对数函数log().

因此,有三种可能的解决方案,每种解决方案都有其独特的丑陋副作用.

  • 将日志类移动到它自己的命名空间,并始终使用它的完全限定名称访问它.我真的想避免这种情况,因为记录器应尽可能方便使用.
  • 编写一个mathwrapper.cpp文件,它是项目中唯一包含的文件<cmath>,并<cmath>通过包装器提供所有必需的功能namespace math.我不想使用这种方法,因为我必须为每个必需的数学函数编写一个包装器,它会增加额外的调用惩罚(部分由-flto编译器标志取消)
  • 我正在考虑的解决方案:

更换

#include <cmath>
Run Code Online (Sandbox Code Playgroud)

通过

namespace math {
#include "math.h"
}
Run Code Online (Sandbox Code Playgroud)

然后通过计算对数函数math::log().

我已经尝试过了,确实可以按预期编译,链接和运行.但它确实有多个缺点:

  • 它(显然)不可能使用<cmath>,因为<cmath>代码通过其完全限定的名称访问函数,并且不推荐在C++中使用它.
  • 我对它有一种非常非常糟糕的感觉,就好像我会受到猛禽的攻击和活着.

所以我的问题是:

  • 是否有任何建议/约定/等禁止在名称空间中包含指令?
  • 可能有什么问题

    • 不同的C标准库实现(我使用glibc),
    • 不同的编译器(我使用g ++ 4.7,-std = c ++ 11),
    • 链接?
  • 你有没有试过这样做?
  • 有没有其他方法可以从全局命名空间中消除数学函数?

我在stackoverflow上发现了几个类似的问题,但大多数是关于包含其他C++头文件,这显然是一个坏主意,而那些没有关于C库链接行为的矛盾陈述.另外,额外放入#include <math.h>内部extern "C" {}是否有益?

编辑

因此,我决定做其他人正在做的事情,并将我的所有代码放在项目命名空间中,并在包含时使用它的完全限定名称访问记录器<cmath>.

c++ namespaces include

13
推荐指数
2
解决办法
2134
查看次数

在同一个项目中包含 &lt;termios.h&gt; 和 &lt;asm/termios.h&gt;

我想什么来实现的:我想要一套定制的baud rate一些价值观tty*UART-mapped终端。

如何:我发现迄今唯一的办法就是使用struct termios2它位于结构<asm/termios>标题(如提到这里,第一个答案)。

到目前为止,我的解决方案效果很好,但现在我需要使用一些功能:

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 *);
Run Code Online (Sandbox Code Playgroud)

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

问题:如果我同时包含头文件(<asm/termios.h><termios.h>),编译器会抱怨函数和结构重新声明,他是对的。

如何在不使用一些晦涩的做法的情况下解决这个问题(例如将标题之一包装在命名空间中,就像这里提到的那样)?

c++ linux header-files termios

5
推荐指数
1
解决办法
3528
查看次数

如何解决两个库的两个头文件的冲突声明?

我正在使用Ubuntu 14.04上的Qt Creator创建一个GUI来控制硬件.我有一个类来控制一个摄像头(camera.h)和一个类来控制连接到USB RS232串行转换器(light.h)的光源.此类的两个头文件包括制造商提供的标题:uEye.h以及ftdi2xx.h相机和串行转换器.如果我单独使用它们,两个库都可以正常工作 但是当我尝试将它们包含在我的内容中时,mainwindow.h我会收到以下错误消息(大约14个):

/home/g/Desktop/release/WinTypes.h:14: error: conflicting declaration
   'typedef unsigned int BOOL'
   typedef unsigned int BOOL;

/usr/include/uEye.h:1570: error: 'BOOL' has a previous declaration as
   'typedef int32_t BOOL'
   typedef int32_t BOOL;
Run Code Online (Sandbox Code Playgroud)

等等.我从其他帖子中了解到,在C++中似乎没有简单的解决方法.有任何建议如何解决(除了使用不同的硬件或有两个单独的程序)?

更新:

最后我找到了一个解决方法,虽然它仍然不是我的问题的确切答案.我做了以下:我去了ftdi2xx.h文件并评论了导致的麻烦#include WinTypes.h.在light.huEye.h首先包括(我猜这个标题包括某种WinTypes.h).然后我需要添加一些在包含之前typedef没有隐藏的遗漏声明.它有效,但它不是一个非常干净和漂亮的解决方案,因为它涉及搞乱第三方的东西. uEye.hftdi2xx.h

c++ qt include header-files

5
推荐指数
1
解决办法
1370
查看次数

如何包含相同标题的两个不同版本?

我正在将文件转换代码从专有文件格式写入一个更通用的.我的目标是支持制造商文件格式的多个版本.

我有相同专有标头的多个版本.标题定义了构成主文件头的各种结构(文件只是一个大标题,后跟原始数据).

我需要读取源文件的前4个字节来确定文件版本.反过来,文件版本告诉我使用哪个版本的C-structs来创建文件.

问题是:

  1. 我无法修改专有标头
  2. 标头不使用名称空间或类
  3. 标题中定义了一些很好的宏

可能的解决方案:

  • 为每个文件版本类型构建不同的转换器二进制文件:-(
    • 对用户和开发人员来说都不方便
  • 为每个版本动态加载库
    • 转换器是面向插件的,因此已经发生了很多这样的事情

我尝试过使用命名空间进行黑客攻击:

namespace version1 {
    #include "version1.h"
}

namespace version2 {
    #include "version2.h"
}

int main (void) {
    version1::header *hdr = new version1::header;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这不会起作用,因为包括警卫,并且因为在每个标题中重新定义了多个宏.

有一种优雅的方式来处理这个问题吗?

c++ conflict header version include

3
推荐指数
1
解决办法
2313
查看次数

将C/C++标准库拉入项目命名空间,好主意?

我正在移植一些开源代码,以便它可以构建在另一个c ++编译器上.似乎不断出现的困难和主题之一是编译器提供的标准库的实现差异.

例如,我正在编译的源文件之一包括<sys/types.h>.但是,它给了我以下错误:

Error E2316 g:\Borland\BCC593\Include\sys/types.h 45: 'time_t' is not a member of 'std'
Error E2272 g:\Borland\BCC593\Include\sys/types.h 45: Identifier expected
Run Code Online (Sandbox Code Playgroud)

在查看了根本原因之后,我发现项目的主要包含标题之一包括<sys/types.h>在这种模式中:

project_source1.cpp:

#include "../TargetPlatform.h"
#include "project_config.h"
#include <windows.h>

namespace project_namespace {
#include "project_component/all.h"
// more project includes down here
// ...
}
Run Code Online (Sandbox Code Playgroud)

project_component/all.h:

#ifndef INCLUDE_GUARDS
#define INCLUDE_GUARDS

#include <sys/types.h>
#include "project_header1.h"
#include "project_header2.h"
// and other headers etc..
// followed with class definitions and what not.

#endif
Run Code Online (Sandbox Code Playgroud)

除了一个问题之外,这一切都很好,<sys/types.h>对于我正在移植到的编译器实现了类似的东西:

<sys/types.h> 修剪到本质:

namespace std {

typedef …
Run Code Online (Sandbox Code Playgroud)

c++ port namespaces

2
推荐指数
1
解决办法
1110
查看次数

我们应该将#include移动到命名空间吗?

可能重复:
在命名空间块中包装#include是个好主意吗?

// Method One
#ifndef XXX_H
#define XXX_H
#include <iostream>
#include "myhead.h"
namespace XXX
{
    /...
}
#endif

OR

// Method Two
namespace XXX
{
#ifndef XXX_H
#define XXX_H

    #include <iostream>
    #include "myhead.h"
    /...
#endif
}
Run Code Online (Sandbox Code Playgroud)

当我们定义一个新的时namespace XXX,我们应该#include directive在命名空间内移动吗?

谢谢

c++

1
推荐指数
1
解决办法
4727
查看次数

标签 统计

c++ ×6

include ×3

header-files ×2

namespaces ×2

conflict ×1

header ×1

linux ×1

port ×1

qt ×1

termios ×1

version ×1