Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将名称空间声明为宏-C++;_C++_Macros_Namespaces - Fatal编程技术网

C++ 将名称空间声明为宏-C++;

C++ 将名称空间声明为宏-C++;,c++,macros,namespaces,C++,Macros,Namespaces,在标准库中,我发现名称空间std被声明为宏 #define _STD_BEGIN namespace std { #define _STD_END } 这是使用名称空间时的最佳实践吗 宏在Microsoft Visual Studio 9.0\VC\include\yvals.h中声明。但是我找不到包含这个的STL文件。如果不包括,如何使用 有什么想法吗 通常不会。宏可能是在某些编译器没有实现名称空间时使用的,或者是为了与特定平台兼容 不知道。该文件可能会包含在STL文件中的其

在标准库中,我发现名称空间
std
被声明为宏

#define _STD_BEGIN  namespace std {
#define _STD_END        }
  • 这是使用名称空间时的最佳实践吗
  • 宏在Microsoft Visual Studio 9.0\VC\include\yvals.h中声明。但是我找不到包含这个的STL文件。如果不包括,如何使用
  • 有什么想法吗

  • 通常不会。宏可能是在某些编译器没有实现名称空间时使用的,或者是为了与特定平台兼容
  • 不知道。该文件可能会包含在STL文件中的其他文件中
    我认为这样做的唯一原因是,如果您想使更改应用程序/库使用的命名空间变得容易,或者出于兼容性原因完全禁用命名空间。

    可能不是最佳做法,因为与普通的
    命名空间
    声明相比,它可能很难阅读。也就是说,请记住,规则并不总是普遍适用的,我相信在某些情况下,宏可能会大幅度地清理问题

    “但我找不到包含此文件的STL文件。如果未包含此文件,如何使用它?”

    所有使用此宏的文件都包括
    yvals.h
    。例如
    包括
    ,其中包括
    ,其中包括
    ,其中包括
    ,其中包括
    。这条链条可能很深,但它确实包含了一些要点


    我想澄清一下,这只适用于标准库的这个特定实现;这绝不是标准化的。

    我在最近使用的库中看到的一种方法是:

    BEGIN_NAMESPACE_XXX()
    
    其中XXX是命名空间级别的数量,例如:

    BEGIN_NAMESPACE_3(ns1, ns1, ns3)
    
    将接受三个参数并扩展到

    namespace ns1 {
        namespace ns2 {
            namespace ns2 {
    
            }
        }
    }
    
    匹配的
    END\u名称空间\u 3
    将扩展到

    namespace ns1 {
        namespace ns2 {
            namespace ns2 {
    
            }
        }
    }
    

    (我只为明了的缘故添加了新行和缩进)

    < P>我可以看到C++中包含的C库的引用(例如,C调用Cord:Ctring,H.<代码),C++调用< Cord>cString < /C> >。在这种情况下,宏定义将取决于
    \ifdef\u c\u plus\u plus


    我一般不会这么做。我想不出任何一个编译器都不支持名字空间、异常、模板或其他“现代”C++特性(现代是引用的,因为这些特性在90年代中后期加入)。事实上,根据我的定义,编译器只有在为各自的语言提供良好支持的情况下才值得使用。这不是语言问题;这是一个简单的例子,“如果我选择了X语言,我更愿意按照现在的情况使用它,而不是像十年或二十年前那样。”例如,我一直不明白为什么有些项目会花时间尝试支持ANSI C之前的编译器。

    谢谢。我检查过,找不到包括此文件在内的其他文件。在C++11及更高版本中,使用此文件对库的版本非常有用。基本上,只要ABI兼容性被破坏,宏就会更改内联命名空间的名称。