问题列表 - 第18203页

没有std命名空间

我们有一个合理大小的C++应用程序,在这个阶段已经很老了,所以它有一些怪癖.

其中一个怪癖是它如何处理使用预标准化标准库的C++编译器.有一个头文件可以解决符合标准的编译器和这个不兼容的编译器之间的任何差异.由于各种原因,我们不能/不想停止支持这个编译器.

#include <vector>
#include <set>
#if defined(NO_STD_LIB)
    #include <iostream.h>
#else
    #incude <iostream>

    using std::string;
    using std::cout;
    using std::vector;
    using std::cout;
#endif
Run Code Online (Sandbox Code Playgroud)

你使用如下

#include stl.h
int main() {
    vector<string> foo;
    .....
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种方法有两个主要问题:

  1. 包含std.h的每个编译单元都必须编译许多不需要的代码(我们试图尽可能地减少编译时间)
  2. 全局命名空间受到std命名空间中通常存在的所有内容的污染.

作为代码清理项目的一部分,我真的想解决这两点.第一个确实是这样做的更重要的原因.

因为我们必须支持这个旧的编译器,所以我们的代码总是要避免将名称与它在标准库中公开的东西冲突,所以第2点并不真正相关,尽管我希望看到一个解决方案,当/如果我们最终可以放弃对它的支持.

到目前为止,我的想法是将超级标题分解为一组较小的标题.例如stl_vector,stl_iostream,stl_set等.这样我们只能包含我们感兴趣的标准库的部分.这些文件名遵循std头的模式,但有一个容易搜索的前缀.因此,当需要转储有问题的编译器时,搜索前缀并将其删除会很简单.

我认为这将很容易解决问题1.

我真正的问题是解决问题2.我想做这样的事情

#if defined(NO_STD_LIB)
    #include <iostream.h>
    #define std
#else
    #include <iostream>
Run Code Online (Sandbox Code Playgroud)

然后我们可以编码如下:

#incude "stl_iostream"

int main() {
  std::string foo("bar");
  std::cout << foo << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这几乎奏效了.没有标准命名空间的地方#define std使std :: string分解成:: string,生活很好.

然后我尝试使用.cc文件,该文件使用了可怕的"using namespace std;" 我得到一个编译错误,因为它变成"使用命名空间",所以这显然是行不通的.

现在显然我可以禁止人们编写"using namespace std;",但是尽管它应该在头文件中避免,但它有时在.cc文件中很有用,你们正在大量使用大量的STL类.

所以,最后,问题.是否存在处理此问题的标准习惯用法.或者,如果没有标准的方法来处理这个问题,那么你使用什么技巧来支持使用预标准标准库的编译器.

我曾经想过使用预编译的头来解决编译速度问题,但是我们针对不同的编译器,并且努力让它们在所有这些编译器中工作可能意味着它不值得花时间去做.

建议我放弃不合格编译器的答案可能很受欢迎,但不会被接受,因为这是我们现在不能做的事情.

c++ compiler-construction namespaces std

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

如何在不同站点之间建立安全的Django单点登录?

我想将我的Django Web应用程序与其他基于Web的产品(很可能是第三方非django应用程序)集成.我如何让其他站点通过单点登录将用户登录到我的站点?如何在我的网站上安全地存储第三方网站用户的用户名和密码,以便将我的用户登录到第三方网站?

django single-sign-on

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

将嵌套文件夹内容递归复制到一个文件夹(终端)

我有一个Wordpress上传文件夹,使用子文件夹构建了几个月.

wolfr2:uploads wolfr$ tree .
.
|-- 2007
|   |-- 08
|   |   |-- beautifulkatamari.jpg
|   |   |-- beautifulkatamari.thumbnail.jpg
|   |   |-- beetle.jpg
|   |   |-- beetle.thumbnail.jpg
Run Code Online (Sandbox Code Playgroud)

如何使用终端将所有图像递归复制到另一个文件夹?我似乎不能像通配符文件名那样使用通配符文件夹.(例如*.jpg或*)(我在Mac OSX上)

cp -R ./*.jpg .
Run Code Online (Sandbox Code Playgroud)

filesystems directory bash terminal

23
推荐指数
2
解决办法
3万
查看次数

我不能在Python中使用花括号吗?

我读到Python通过缩进而不是花括号来完成它所有的"代码块".是对的吗?所以函数,如果这样的东西都没有用花括号包围它们的块?

python

44
推荐指数
11
解决办法
5万
查看次数

创建FK会自动索引列吗?

我正在使用mySQL 5.1,我想知道,在FK关系中定义后,是否有必要在列上添加CREATE INDEX语法.常识告诉我,如果列是一个键(外来的或其他的),那么它需要被索引 - 但你永远不知道......

我是否必须在我的FK上显式创建索引 - 或者创建FK是否隐式在列上创建索引?

mysql sql

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

PHP:将日期转换为秒?

我的约会时间是2009年12月15日星期二.如何将其转换为秒?

更新:如何将上述格式的日期转换为Unix时间戳?

php

5
推荐指数
3
解决办法
4万
查看次数

增强内存映射文件的问题:它们转到磁盘而不是RAM

我试图了解Boost内存映射文件的工作原理.下面的代码可以工作,它可以完成它应该做的事情,但问题是它生成的文件存储在磁盘上(在可执行文件的同一目录中)而不是内存.也许有一个标志设置在某处,但我找不到它...
提前感谢任何信息!

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <boost/iostreams/device/mapped_file.hpp>
    using std::cout;
    using std::endl;

    int main(int argc, char** argv) {
     const int blockSize = 64;
     bool writer = false;

     if(argc > 1) {
      if(!strcmp(argv[1], "w"))
       writer = true;
     }

     boost::iostreams::mapped_file_params  params;
     params.path = "map.dat";
    // params.length = 1024;     // default: all the file
     params.new_file_size = blockSize;

     if(writer) {
      cout << "Writer" << endl;
      params.mode = std::ios_base::out;
     }
     else {
      cout << "Reader" << endl;
      params.mode = std::ios_base::in;
     }

        boost::iostreams::mapped_file  mf; …
Run Code Online (Sandbox Code Playgroud)

c++ boost memory-mapped-files ramdisk

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

坐标格式

42 SXC 965214 452136

有人请告诉我上面的坐标是什么?如何从上面的坐标导出距离?我迫切需要它.

coordinates

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

为什么热插拔vtables不是一种流行的语言功能?

在面向对象的编程中,能够修改已创建对象的行为有时会很好.当然,这可以通过相对冗长的技术来完成,例如策略模式.但是,有时通过在实例化后更改vtable指针来完全更改对象的类型会更好.假设你从A级转换到B级,这将是安全的:

  1. B类是A类的子类,不添加任何新字段,或
  2. B类和A类具有相同的父类.除了从父类重写虚函数之外,都不做任何事情.(没有新的字段或虚函数.)
  3. 在任何一种情况下,A和B必须具有相同的不变量.

这在C++和D编程语言中是可以攻击的,因为指针可以随意转换,但是它太丑陋且难以理解,我害怕在需要其他人理解的代码中执行它.为什么通常不提供更高级别的方法呢?

oop pointers virtual-functions language-design

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

Ruby on Rails collection_select显示属性

我是Rails的新手,正在使用该collection_select方法.

我有两个要在选择框中显示的字段:

first_namelast_name

到目前为止,我只能显示一个或另一个,而不是两者.

这是我正在使用的代码:

collection_select(:hour,:shopper_id,@shoppers,:id,"last_name")
Run Code Online (Sandbox Code Playgroud)

谢谢.

ruby-on-rails

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