• Advertisement
Sign in to follow this  

Unity Ok, using namespace or not? And why?

This topic is 4858 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Twice today I have seen posts in various places where people have said: ...Don't put using namespace std; in your headers, use std::string (or whatever) instead... Here and In a comment here I thought the whole point of using namespaces to begin with was to avoid having to use the longer notation? In my other posts about my IniFile class, several people suggested that I make it a namespace instead of class for the exact reason of being able to use "using namespace". So which is it? To use namespace or not to use namespace? That is my question :)

Share this post


Link to post
Share on other sites
Advertisement
Everyone has different coding styles. People who say, "Don't type 'using namespace...'", should realize that everyone has different coding styles. I would have to agree with them, however, that it is better practice when you don't mind typing more. This way you know what is actually local to the file, and what you need to access throught a specific scope using '::'.

My opinion is if you only need to type 'namespace::function()', then type it out, otherwise I would put a using to avoid typing so much.

As far as string goes, I've had some problems when including specific headers in VC6, so I usually just type out the std::string

Share this post


Link to post
Share on other sites
You can put using namespace std in your own cpp file if you must.

When things are declared in a namespace, the intention is to avoid polluting the global namespace with names. For example if I write a class called string and you write a class called string and I want to use your library with my library, I've got a problem. If both headers declaring the classes are included the compiler can't tell the difference between the two when I refer to a string (and neither can I). So if we both put our string classes nicely into a namespace they can be qualified with the namespace:


#ifndef TODDLIB_STRING_H
#define TODDLIB_STRING_H

namespace toddlib {
class string;//etc
}

#endif




#ifndef PETELIB_STRING_H
#define PETELIB_STRING_H

namespace petelib {
class string;//etc
}

#endif




#include "toddlib/string.h"
#include "petelib/string.h"

int main() {
using petelib::string
string address;//uses petelib::string no ambiguity

toddlib::string name;//uses toddlib::string no ambiguity
return 0;
}




So they coexist nicely. However, if you have some header which says using toddlib::string (or even worse using namespace toddlib), then any place I include your header, I won't be able to unambiguously use my own string:


#ifndef TODDLIB_SOMETHING_BAD_H
#define TODDLIB_SOMETHING_BAD_H

#include "string"
using namespace toddlib;

void printName(string);//uses string from toddlib
//void printName(toddlib::string);//better way doesn't need 'using'

#endif



#include "toddlib/something_bad.h"
#include "petelib/string"

int main() {
using petelib::string
string address;//ambiguity because something_bad.h brought
//toddlib::string into global scope
return 0;
}

Share this post


Link to post
Share on other sites
The whole reason is to avoid conflicts with type names, global variables, etc. If I released a library with a class in it, I'd want to make sure that it wouldn't interfere with the user's code if they happened to have a class with the same name.

Also, you can split your project into different namespaces to help you organise it. For example: namespace Engine, namespace Engine::Foundation, namespace Engine::Core.

Share this post


Link to post
Share on other sites
Quote:
Original post by petewood
However, if you have some header which says using toddlib::string (or even worse using namespace toddlib), then any place I include your header, I won't be able to unambiguously use my own string


Ah... I see what you are saying now. So if I release my IniFile class for someone else to use, and using namespace whatever is in my header, then that namespace will be pulled into their program too, possibly causing problems, or at least adding overhead.

Ok, that makes sense.

Share this post


Link to post
Share on other sites
In regard to the worries related to excessive typing:

You can alias namespaces. So I have namespaces which divide my projects up into separate parts:


namespace library_name {
namespace component_name {
namespace detail {
}
}
}


When I am working on the detail part I wrap the whole cpp file as above and don't have to use all the qualifications (unless there is some ambiguity).

When I am making use of the library component I might alias the library name and component to lncn (library name component name, see (c:)


namespace lncn = library_name::component_name;

lncn::string player;
lncn::string comments;
//or
using lncn;
string player2;
string more_comments;

Share this post


Link to post
Share on other sites
Quote:
Original post by toddhd
Quote:
Original post by petewood
However, if you have some header which says using toddlib::string (or even worse using namespace toddlib), then any place I include your header, I won't be able to unambiguously use my own string

Ah... I see what you are saying now. So if I release my IniFile class for someone else to use, and using namespace whatever is in my header, then that namespace will be pulled into their program too, possibly causing problems, or at least adding overhead.

Ok, that makes sense.


Right, you've got it. (c:

Basically it's to do with being friendly.

There won't be any overhead at runtime, only at compile time with the set of names the compiler will consider for lookup.

Share this post


Link to post
Share on other sites
Quote:
Original post by toddhd
...Don't put using namespace std; in your headers, use std::string (or whatever) instead...

Yes, because it can cause naming conflicts in code that 'uses' those headers.
Quote:
I thought the whole point of using namespaces to begin with was to avoid having to use the longer notation?

To avoid having to write (using SDL as an example) SDL_Init instead of Init. But if your headers start using namespaces, any file that includes them will also be forced to include those namespaces. This becomes problematic when two Init functions exist in seperate namespaces. Why?

1) The programmer is forced, if both namespaces are included, to forevermore use sdl::init and myotherlib::init (if both these existed) even if he only really wanted to call one of those. Thus, by saving some typing in the headers (which have less code (usually) than source files), you can force both more typing in using code (read: source files, the longer ones) and potential headaches (not realising that the headers use a namespace, causing compile errors with the bellow code:)

#include "c++sdl/sdl.hh" //uses namespace sdl like the sneaky devil you made it be
#include "otherlib/otherlib.hh"
using namespace otherlib;

//...

void SomeClass::InitSubsystemA ( void )
{
if (! gOtherLibInitialized) init(); //ERROR: sdl::init or otherlib::init?
}



Quote:
In my other posts about my IniFile class, several people suggested that I make it a namespace instead of class for the exact reason of being able to use "using namespace".


Sounds good, but only do the using namespace bit in your SOURCE FILES, NOT your headers. Using them in headers entirely defeats the purpouse of namespaces for any code that uses those headers.

Quote:
So which is it? To use namespace or not to use namespace?
That is my question :)


Use them or I will be angry ;-).

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
  • Advertisement
  • Popular Now

  • Advertisement
  • Similar Content

    • By eldwin11929
      We're looking for programmers for our project.
      Our project is being made in Unity
      Requirements:
      -Skills in Unity
      -C#
      -Javascript
      -Node.js
      We're looking for programmers who can perform a variety of functions on our project.
      Project is a top-down hack-and-slash pvp dungeon-crawler like game. Game is entirely multiplayer based, using randomized dungeons, and a unique combat system with emphasis on gameplay.
      We have a GDD to work off of, and a Lead Programmer you would work under.
      Assignments may include:
      -Creating new scripts of varying degrees specific to the project (mostly server-side, but sometimes client-side)
      -Assembling already created monsters/characters with existing or non-existing code.
      -Creating VFX
      -Assembling already created environment models
      If interested, please contact: eldwin11929@yahoo.com
      This project is unpaid, but with royalties.
       
      ---
      Additional Project Info:
      Summary:
      Bassetune Reapers is a Player-verus-Player, competitive dungeon crawler. This basically takes on aspects of dungeon crawling, but with a more aggressive setting. Players will have the option to play as the "dungeon-crawlers" (called the 'Knights', or "Knight Class", in-game) or as the "dungeon" itself (literally called the 'Bosses', or "Boss Class", in-game). What this means is that players can choose to play as the people invading the dungeon, or as the dungeon-holders themselves.
      Key Features:
      -Intense, fast-paced combat
      -Multiple skills, weapons, and ways to play the game
      -Tons of different Bosses, Minibosses, creatures and traps to utilize throughout the dungeon
      -Multiple unique environments
      -Interesting, detailed lore behind both the game and world
      -Intricate RPG system
      -Ladder and ranking system
      -Lots of customization for both classes s of customization for both classes
    • By RoKabium Games
      Custom coffee mugs have arrived... More caffeine!
      Have a great weekend everyone! 
      #gamedev #indiedev #sama #caffeine
    • By Atwo Studios
       
      Hey guys,

      Anthony here from Atwo Studios bringing you some new updates for the new year!
      In this video I go over our game ROY, the new games and some general updates to the company!

      If you have not checked out ROY feel free to give it a try! Many people have said they enjoyed the game thus far!
      ROY: https://goo.gl/o6JJ5P
       
    • By Affgoo
      https://play.google.com/store/apps/details?id=com.NE.Alien
      still a lot of work to do, but its pretty stable  please let me know what you think <3
      Atlas Sentry is a game of destroy everything. Using your turret, simply swivel and shoot your way to victory, upgrading your weapons to unleash destruction on the variety of spaceships. The bigger your combo’s the more score you get! Earn silver as you play and then purchase new weapons and abilities to better deal with your enemy. Different enemies use different tactics and weapons, work out your own priorities in their destruction order. 

      Features: 
      **2 different game modes 
      **A level select mode with 20 difficult levels including a final boss, can you defeat it? **Arcade mode of endless destruction, how long will you last? 
      **High scores to compete against others, see who can take the top spot. 
       
    • By Chamferbox
      Chamferbox, a mini game asset store has just opened with some nice game assets, 
      Here you can find a free greek statue asset 

      Also check their dragon, zombie dragon and scorpion monster out:



      They're running the Grand Opening Sale, it's 30% off for all items, but for gamedev member, you can use this coupon code:
      GRANDOPEN
      to get 50% off prices What are you waiting for, go to
      http://chamferbox.com
      and get those models now!

      View full story
  • Advertisement