472,958 Members | 2,059 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,958 software developers and data experts.

Enum within function, is this standard?

I'm using an enum that's declared within a function (since I only need it
within that function.)

I can't find anything about this in "The C++ Programming Language" by
Stroustroup and I don't have the standard.

Is this legal?

// test.cpp
#include <iostream>

int main() {
enum {zero,one,two};
std::cout << zero << " " << one << " " << two << std::endl;
return 0;
}

g++ seems to think so:

$ g++ -ansi -pedantic -Wall test.cpp

Gives no output, which means no error or warnings.
--
NPV

"the large print giveth, and the small print taketh away"
Tom Waits - Step right up

Jul 19 '05 #1
5 22345
"Nils Petter Vaskinn" <no@spam.for.me.invalid> wrote in message
news:pa****************************@spam.for.me.in valid...
| Is this legal?
|
| // test.cpp
| #include <iostream>
|
| int main() {
| enum {zero,one,two};
| std::cout << zero << " " << one << " " << two << std::endl;
| return 0;
| }

Yes, this is a totally legal anonymous enum declaration.

Structs and classes may be declared within a function
as well (and may also be anonymous).
The only limitation with types that are declared within
a function (rather than at namespace or class scope)
is that they cannot be used as template parameters.

hth - Ivan
--
http://ivan.vecerina.com


Jul 19 '05 #2
Ivan Vecerina wrote:
Structs and classes may be declared within a function
as well (and may also be anonymous).
The only limitation with types that are declared within
a function (rather than at namespace or class scope)
is that they cannot be used as template parameters.


so the following breaks? why?

template <typename T>
struct A
{
T t;
};

void f()
{
enum B { zero, one };
A<B> t;
}
-----[ Domenico Andreoli, aka cavok
--[ http://filibusta.crema.unimi.it/~cavok/gpgkey.asc
---[ 3A0F 2F80 F79C 678A 8936 4FEE 0677 9033 A20E BC50

Jul 19 '05 #3
Domenico Andreoli wrote in news:86Qsb.112809$vO5.4389182
@twister1.libero.it:
Ivan Vecerina wrote:


[micro-snip]
The only limitation with types that are declared within
a function (rather than at namespace or class scope)
is that they cannot be used as template parameters.


so the following breaks? why?

template <typename T>
struct A
{
T t;
};

void f()
{
enum B { zero, one };
A<B> t;
}


The name B doesn't have external linkage. If you consider adding:

void g()
{
enum B { three, four };
A<B> t;
}

You can see the problem, you've actually tried to create 2 types
bothe withe the same id A< no-real-name-enum >.

IOW templates base there external-linkage on the external-linkage
of there arguments.

This is how the standard was/is writen. It could have been otherwise,
but would the benefits outway the cost (for implementers this is
man-hour's of programming, for us it's more waiting for fully
conforming compiler's).

Rob.
--
http://www.victim-prime.dsl.pipex.com/
Jul 19 '05 #4
"Rob Williscroft" <rt*@freenet.REMOVE.co.uk> wrote in message
news:Xn**********************************@195.129. 110.204...
Domenico Andreoli wrote in news:86Qsb.112809$vO5.4389182
@twister1.libero.it:
so the following breaks? why?

template <typename T>
struct A
{
T t;
};

void f()
{
enum B { zero, one };
A<B> t;
}
The name B doesn't have external linkage. If you consider adding:

Exact. IOW templates base there external-linkage on the external-linkage
of there arguments. Which from a typical implementation's perspective means that
the name of the parameter type is mangled into (used as part of)
the name of template instanciation.
This is how the standard was/is writen. It could have been otherwise,
but would the benefits outway the cost (for implementers this is
man-hour's of programming, for us it's more waiting for fully
conforming compiler's).

Maybe, but this is debatable. Since the compiler has support for
anonymous namespaces, it knows how to generate unique names
already.

Many find this limitation is especially annoying when writing
functors and predicates:
void sortByAge(std::vector<Item>& items)
{
struct AgeCompare {
bool operator()(Item const& a, Item const&b)
{ return a.age<b.age; }
};
std::sort(items.begin(),items.end(),AgeCompare()); //error
}
Because AgeCompare has no external linkage, it has to be
moved out of the function. Ugly.

I'm pretty sure that dropping this limitation has been proposed
for the next C++ standard...

Regards,
Ivan
--
http://ivan.vecerina.com


Jul 19 '05 #5
Ivan Vecerina wrote in news:bp*********@newshispeed.ch:
"Rob Williscroft" <rt*@freenet.REMOVE.co.uk> wrote in message
news:Xn**********************************@195.129. 110.204...
[snip]
The name B doesn't have external linkage. If you consider adding:

Exact.
IOW templates base there external-linkage on the external-linkage
of there arguments.

Which from a typical implementation's perspective means that
the name of the parameter type is mangled into (used as part of)
the name of template instanciation.
This is how the standard was/is writen. It could have been otherwise,
but would the benefits outway the cost (for implementers this is
man-hour's of programming, for us it's more waiting for fully
conforming compiler's).

Maybe, but this is debatable. Since the compiler has support for
anonymous namespaces, it knows how to generate unique names
already.

Yes, the above was an attempt at a (partial) explanation of why it
isn't currently in the standard. Not a suggestion that it isn't worth
putting in the next.

In fact gcc can already do this (at least with local classes). Also
it should be easier than for anonymous namespaces as there is already a
unique name (the function's) to base the external-linkage-name on.
Many find this limitation is especially annoying when writing
functors and predicates:
void sortByAge(std::vector<Item>& items)
{
struct AgeCompare {
bool operator()(Item const& a, Item const&b)
{ return a.age<b.age; }
};
std::sort(items.begin(),items.end(),AgeCompare()); //error
}
Because AgeCompare has no external linkage, it has to be
moved out of the function. Ugly.

I'm pretty sure that dropping this limitation has been proposed
for the next C++ standard...


I have a vague recollection of reading something about this, but I
can't remember what is covered, 1) local classes, 2) local enum's,
3) nameless classes (struct {} x;) and 4) nameless enum's. It's
probably just 1 and 2, but 3 and 4 should be doable too, but does
anybody care enough to write up the proposal and justify it to the
committee ?

Some people would like to write (vc6 users currently can):

some_template< "string-id" >;

Maybe well get that too.

All of these thing's would be nice (and useful), but there not top
of my wish list (Move semantics and unlimited template paramiters are).

Rob.
--
http://www.victim-prime.dsl.pipex.com/
Jul 19 '05 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Shugong Wang | last post by:
getch() function is not a standard C/C++ function. Thought gcc provieds ncurses.h and a getch() function is realized, I still want to know how to realize a getch() function in standard c or c++.
4
by: imme929 | last post by:
I got things working until I tried adding this enum to a structure... Public Enum Keyboard EnglishUS EnglishUK Spanish German Italian French
13
by: Anthony de Almeida Lopes | last post by:
Hello, I am wondering why it is not possible to have a function-like macro like the following: #define __nothread(name) do { \ #ifdef _PTHREAD_H ...
2
by: mj | last post by:
Hi, I recently have found it necessary to move from fortran to c++ for scientific programming... I'm working on a program that needs to resize a 2d vector of vectors within a function... This...
3
by: not_a_commie | last post by:
Does MS have an official C# variable/function/codingstyle standard that is available on the internet? What standard do they use for their internal coding? Mind posting a link? Thanks.
4
by: cupa | last post by:
Hi, is it posible to execute script from file within function (sql or pl/sql or ...)
6
by: sethukr | last post by:
can we define enum within a structure?? for example, typedef enum {red,blue}color; struct s1{ color c; }obj;
2
by: gert | last post by:
obj=function() { this.attribute=1 this.method=function() { img=document.createElement('img') img.onclick=function { this.attribute=2 // i need the obj this not the img this :) }
8
by: thatcollegeguy | last post by:
http://smarterfootball.com/exits/theHTML.html I am not sure what is wrong w/ this code. The main issue is that the table that is in the initial html will empty its td but the table that I load...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 4 Oct 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
by: Aliciasmith | last post by:
In an age dominated by smartphones, having a mobile app for your business is no longer an option; it's a necessity. Whether you're a startup or an established enterprise, finding the right mobile app...
2
by: giovanniandrean | last post by:
The energy model is structured as follows and uses excel sheets to give input data: 1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
4
NeoPa
by: NeoPa | last post by:
Hello everyone. I find myself stuck trying to find the VBA way to get Access to create a PDF of the currently-selected (and open) object (Form or Report). I know it can be done by selecting :...
1
by: Teri B | last post by:
Hi, I have created a sub-form Roles. In my course form the user selects the roles assigned to the course. 0ne-to-many. One course many roles. Then I created a report based on the Course form and...
0
NeoPa
by: NeoPa | last post by:
Introduction For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
0
isladogs
by: isladogs | last post by:
The next online meeting of the Access Europe User Group will be on Wednesday 6 Dec 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, Mike...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.