getenv() in global space?

S

silrandir

when attempting to call getenv() in global memory (c/c++), it
constantly returns null, but when called in main, it properly reads the
environment. is this expected behavior?

sample code:
#include <cstdlib>
#include <stdio.h>
#include <unistd.h>

using namespace std;
#define TEST "TEST"

int debug = getenv(TEST)?1:0;

int main()
{
if(debugstr)
write(2, "\nTEST FOUND\n", 12);
else
write(2, "\nTEST NOT FOUND\n", 16);
}
 
K

Keith Thompson

when attempting to call getenv() in global memory (c/c++), it
constantly returns null, but when called in main, it properly reads the
environment. is this expected behavior?

sample code:
#include <cstdlib>
#include <stdio.h>
#include <unistd.h>

using namespace std;
#define TEST "TEST"

int debug = getenv(TEST)?1:0;

int main()
{
if(debugstr)
write(2, "\nTEST FOUND\n", 12);
else
write(2, "\nTEST NOT FOUND\n", 16);
}

Your code is C++, not C. comp.lang.c++ is down the hall on the right,
just past the water cooler.

In C, "All the expressions in an initializer for an object that has
static storage duration shall be constant expressions or string
literals" (C99 6.7.8p4), so your code can't even be translated
into correct C.

When you post to comp.lang.c++, I suggest you post the *actual* code
that you fed to your compiler; the code you posted declares "debug"
but tries to refer to "debugstr". I also suggest not using the
non-standard write() function; both C and C++ provide better and more
standard ways to print text.

(I don't know of any reason why getenv() would behave differently
depending on the context in which you call it, but maybe there's
something C++-specific that I don't know about.)
 
A

Alesak

Hi,

that's funny, it works for me (linux, gcc 3.3.6, glibc 2.3.5). My guess
is that the full syntax of calling "main" is

int main (int argc, const char **argv, const char **envp);

that means that the pointer to environment buffer comes to the program
as a parameter of it's "main" function, then it should be put into the
"environ" global variable, which is accessed by "getenv". I am not sure
if it is clearly set for C++, what comes first - if the initialization
of global variables or this.

Sorry, that was nothing new

Ales
 
M

Martin Ambuhl

when attempting to call getenv() in global memory (c/c++), it
constantly returns null, but when called in main, it properly reads the
environment. is this expected behavior?

sample code:
#include <cstdlib>
#include <stdio.h>
#include <unistd.h>

using namespace std;
#define TEST "TEST"

int debug = getenv(TEST)?1:0;

int main()
{
if(debugstr)
write(2, "\nTEST FOUND\n", 12);
else
write(2, "\nTEST NOT FOUND\n", 16);
}


/* Note that the term "global memory" has no meaning in either C or
C++, and that there is no such language as "c/c++". Since the term
"global memory" has no meaning, "when attempting to call getenv()
in global memory" is gibberish, and any question based on it is
meaningless. */

#if 0
#include <cstdlib> /* mha: no such standard C header */
#include <unistd.h> /* mha: no such standard C header */
using namespace std; /* mha: gibberish; syntax error */
int debug = getenv(TEST) ? 1 : 0; /* mha: intializers outside of
functions must be constant */
#endif

#include <stdlib.h> /* mha: added for getenv */
#include <stdio.h>

#define TEST "TEST"


int main()
{
int debug = getenv(TEST) ? 1 : 0; /* mha: intializers inside
functions do not need to be
constants */
/* mha: undefined identifier 'debugstr' changed, nonsensical use of
nonstandard function 'write' changed */
printf("\"TEST\" %sfound\n", debug ? "" : "not ");
return 0; /* mha: added. Functions that promise
to return values should do so. This
broken C++ism of allowing dropping
off the end of main was added to the
C standard only in 1999 because of
the number of defective programmers
who kept violating the basic rule of
good sense. */
}
 
J

Jordan Abel

that's funny, it works for me (linux, gcc 3.3.6, glibc 2.3.5). My guess
is that the full syntax of calling "main" is

int main (int argc, const char **argv, const char **envp);

that means that the pointer to environment buffer comes to the program
as a parameter of it's "main" function, then it should be put into the
"environ" global variable, which is accessed by "getenv". I am not sure
if it is clearly set for C++, what comes first - if the initialization
of global variables or this.

well, not quite. the environment buffer goes to the startup code, which
then sets up the pointers to it, puts that in environ, and passes
environ to main. Either way, it apparently happens after the phase which
is where your non-constant global initialization is being done
</OT>
 
M

Micah Cowan

when attempting to call getenv() in global memory (c/c++), it
constantly returns null, but when called in main, it properly reads the
environment. is this expected behavior?

Since you're in comp.lang.c, I'm going to assume the below snippet was
intended to be C code.

Also, given the content of your code, I think you meant "file scope"
where you said "global memory". The latter term doesn't have a defined
meaning here (nor at comp.lang.c++). A getenv() call in main() would
take place in "block scope".
#include <cstdlib>

Should be stdlib.h. And, at least be consistent. If you're going to
#include <stdio.h>
#include <unistd.h>

unistd.h is not a Standard C header, and is thus not relevant to this
newsgroup. Similarly for the write() functions you use below.
using namespace std;

Meaningless in C.
#define TEST "TEST"

int debug = getenv(TEST)?1:0;

C does not allow you to make function calls in file-scope initializers
(or initializers for any other statically allocated object).
int main()
{
if(debugstr)

I'm assuming this is a typo: I'm gonna assume debug.
write(2, "\nTEST FOUND\n", 12);
else
write(2, "\nTEST NOT FOUND\n", 16);
}

<OT>
Other than the typo, your program compiled /and/ executed as you
might expect as C++ code on a POSIX system.
</OT>

Aside from that: if you want to make it code that is generally
discussable on this newsgroup, you'll need to take the POSIXisms and
C++isms out, and after that you'll need to move the initialization
(and possibly, the definition) of debug into main() to get it to work
properly.

<OT>
Or, you can leave your code as is and move your question to
comp.unix.programmer. In that case, I'd still recommend you make a
consistent choice regarding <cstdlib> vs <stdlib.h>.
</OT>

-Micah
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top