Dev C Using Namespace Std
- C++ Basics
Feb 01, 2012 However, with the new thought that standard C header files should not have.h, the same files can also be included without.h, but they do need a 'c' prefix then. Moreover, all standard C functions and symbols reside in the namespace 'std' now, although the old-style header files still reside in the global namespace. Sets the decimal precision to be used to format floating-point values on output operations. Behaves as if member precision were called with n as argument on the stream on which it is inserted/extracted as a manipulator (it can be inserted/extracted on input streams or output streams). Jan 01, 2007 個人的習慣,則是直接使用using namespace std,基本上,我是個蠻懶得打字的傢伙。 搞懂命名空間,只是C程式撰寫的第一步,還沒真正踏進C的世界,充其量,也不過就是在門口張望罷了!而我現在,還在C的門口徘徊。.
- C++ Object Oriented
- C++ Advanced
- C++ Useful Resources
- Selected Reading
Consider a situation, when we have two persons with the same name, Zara, in the same class. Whenever we need to differentiate them definitely we would have to use some additional information along with their name, like either the area, if they live in different area or their mother’s or father’s name, etc.
Same situation can arise in your C++ applications. For example, you might be writing some code that has a function called xyz() and there is another library available which is also having same function xyz(). Now the compiler has no way of knowing which version of xyz() function you are referring to within your code.
A namespace is designed to overcome this difficulty and is used as additional information to differentiate similar functions, classes, variables etc. with the same name available in different libraries. Using namespace, you can define the context in which names are defined. In essence, a namespace defines a scope.
Defining a Namespace
A namespace definition begins with the keyword namespace followed by the namespace name as follows −
To call the namespace-enabled version of either function or variable, prepend (::) the namespace name as follows −
Let us see how namespace scope the entities including variable and functions −
If we compile and run above code, this would produce the following result −
The using directive
You can also avoid prepending of namespaces with the using namespace directive. This directive tells the compiler that the subsequent code is making use of names in the specified namespace. The namespace is thus implied for the following code −
Using Namespace Std
If we compile and run above code, this would produce the following result −
The ‘using’ directive can also be used to refer to a particular item within a namespace. For example, if the only part of the std namespace that you intend to use is cout, you can refer to it as follows −
Subsequent code can refer to cout without prepending the namespace, but other items in the std namespace will still need to be explicit as follows −
If we compile and run above code, this would produce the following result −
Names introduced in a using directive obey normal scope rules. The name is visible from the point of the using directive to the end of the scope in which the directive is found. Entities with the same name defined in an outer scope are hidden.
Discontiguous Namespaces
Dev C Using Namespace Std Code
A namespace can be defined in several parts and so a namespace is made up of the sum of its separately defined parts. The separate parts of a namespace can be spread over multiple files.
So, if one part of the namespace requires a name defined in another file, that name must still be declared. Writing a following namespace definition either defines a new namespace or adds new elements to an existing one −
Nested Namespaces
Namespaces can be nested where you can define one namespace inside another name space as follows −
You can access members of nested namespace by using resolution operators as follows −
In the above statements if you are using namespace_name1, then it will make elements of namespace_name2 available in the scope as follows −
If we compile and run above code, this would produce the following result −
-->A namespace is a declarative region that provides a scope to the identifiers (the names of types, functions, variables, etc) inside it. Namespaces are used to organize code into logical groups and to prevent name collisions that can occur especially when your code base includes multiple libraries. All identifiers at namespace scope are visible to one another without qualification. Identifiers outside the namespace can access the members by using the fully qualified name for each identifier, for example std::vector<std::string> vec;
, or else by a using Declaration for a single identifier (using std::string
), or a using Directive for all the identifiers in the namespace (using namespace std;
). Code in header files should always use the fully qualified namespace name.
The following example shows a namespace declaration and three ways that code outside the namespace can accesses their members.
Use the fully qualified name:
Use a using declaration to bring one identifier into scope:
Use a using directive to bring everything in the namespace into scope:
using directives
The using directive allows all the names in a namespace to be used without the namespace-name as an explicit qualifier. Use a using directive in an implementation file (i.e. *.cpp) if you are using several different identifiers in a namespace; if you are just using one or two identifiers, then consider a using declaration to only bring those identifiers into scope and not all the identifiers in the namespace. If a local variable has the same name as a namespace variable, the namespace variable is hidden. It is an error to have a namespace variable with the same name as a global variable.
Note
A using directive can be placed at the top of a .cpp file (at file scope), or inside a class or function definition. Dev c++ download for windows 7.
In general, avoid putting using directives in header files (*.h) because any file that includes that header will bring everything in the namespace into scope, which can cause name hiding and name collision problems that are very difficult to debug. Always use fully qualified names in a header file. If those names get too long, you can use a namespace alias to shorten them. (See below.)
C++ Namespace Std
Declaring namespaces and namespace members
Typically, you declare a namespace in a header file. If your function implementations are in a separate file, then qualify the function names, as in this example.
Function implementations in contosodata.cpp should use the fully qualified name, even if you place a using directive at the top of the file:
A namespace can be declared in multiple blocks in a single file, and in multiple files. The compiler joins the parts together during preprocessing and the resulting namespace contains all the members declared in all the parts. An example of this is the std namespace which is declared in each of the header files in the standard library.
Members of a named namespace can be defined outside the namespace in which they are declared by explicit qualification of the name being defined. However, the definition must appear after the point of declaration in a namespace that encloses the declaration's namespace. For example:
This error can occur when namespace members are declared across multiple header files, and you have not included those headers in the correct order.
The global namespace
If an identifier is not declared in an explicit namespace, it is part of the implicit global namespace. In general, try to avoid making declarations at global scope when possible, except for the entry point main Function, which is required to be in the global namespace. To explicitly qualify a global identifier, use the scope resolution operator with no name, as in ::SomeFunction(x);
. This will differentiate the identifier from anything with the same name in any other namespace, and it will also help to make your code easier for others to understand.
The std namespace
All C++ standard library types and functions are declared in the std
namespace or namespaces nested inside std
.
Nested namespaces
Namespaces may be nested. An ordinary nested namespace has unqualified access to its parent's members, but the parent members do not have unqualified access to the nested namespace (unless it is declared as inline), as shown in the following example:
Ordinary nested namespaces can be used to encapsulate internal implementation details that are not part of the public interface of the parent namespace.
Inline namespaces (C++ 11)
In contrast to an ordinary nested namespace, members of an inline namespace are treated as members of the parent namespace. This characteristic enables argument dependent lookup on overloaded functions to work on functions that have overloads in a parent and a nested inline namespace. It also enables you to declare a specialization in a parent namespace for a template that is declared in the inline namespace. The following example shows how external code binds to the inline namespace by default:
The following example shows how you can declare a specialization in a parent of a template that is declared in an inline namespace:
You can use inline namespaces as a versioning mechanism to manage changes to the public interface of a library. For example, you can create a single parent namespace, and encapsulate each version of the interface in its own namespace nested inside the parent. The namespace that holds the most recent or preferred version is qualified as inline, and is therefore exposed as if it were a direct member of the parent namespace. Client code that invokes the Parent::Class will automatically bind to the new code. Clients that prefer to use the older version can still access it by using the fully qualified path to the nested namespace that has that code.
The inline keyword must be applied to the first declaration of the namespace in a compilation unit.
The following example shows two versions of an interface, each in a nested namespace. The v_20
namespace has some modification from the v_10
interface and is marked as inline. Client code that uses the new library and calls Contoso::Funcs::Add
will invoke the v_20 version. Code that attempts to call Contoso::Funcs::Divide
will now get a compile time error. If they really need that function, they can still access the v_10
version by explicitly calling Contoso::v_10::Funcs::Divide
.
Namespace aliases
Namespace names need to be unique, which means that often they should not be too short. If the length of a name makes code difficult to read, or is tedious to type in a header file where using directives can't be used, then you can make a namespace alias which serves as an abbreviation for the actual name. For example:
anonymous or unnamed namespaces
You can create an explicit namespace but not give it a name:
This is called an unnamed or anonymous namespace and it is useful when you want to make variable declarations invisible to code in other files (i.e. give them internal linkage) without having to create a named namespace. All code in the same file can see the identifiers in an unnamed namespace but the identifiers, along with the namespace itself, are not visible outside that file—or more precisely outside the translation unit.