Hello,
I would like to have something like
#ifdef VERSION_DEBUG
#define DEBUG(x) DebugFnc(x)
#end
#ifdef VERSION_RELEASE
#define DEBUG(x) <empty-statement>
#end
but I'm not sure how to implement the empty statement.. the problem, of
course is in the extra semicolon when the macro is called as in,
DEBUG(x); in release version. One of the possible solutions is to set
#define DEBUG(x) do{}while(0)
but I am not sure whether the compiler is smart enough
to optimize this. Any other ideas, comments?
--
Maksim Sipos 10 4267
What about:
#define DEBUG(x) ;
Does this work?
--
gabriel
Maksim Sipos wrote: Hello, I would like to have something like
#ifdef VERSION_DEBUG #define DEBUG(x) DebugFnc(x) #end
#ifdef VERSION_RELEASE #define DEBUG(x) <empty-statement> #end
but I'm not sure how to implement the empty statement.. the problem, of course is in the extra semicolon when the macro is called as in, DEBUG(x); in release version.
[...]
Simply define it as nothing:
#define DEBUG(x)
Why is "the extra semicolon" a problem in the release version?
Can you give a sample of code where it doesn't work?
--
+---------+----------------------------------+-----------------------------+
| Kenneth | kenbrody at spamcop.net | "The opinions expressed |
| J. | http://www.hvcomputer.com | herein are not necessarily |
| Brody | http://www.fptech.com | those of fP Technologies." |
+---------+----------------------------------+-----------------------------+
Maksim Sipos wrote: Hello, I would like to have something like
#ifdef VERSION_DEBUG #define DEBUG(x) DebugFnc(x) #end
#ifdef VERSION_RELEASE #define DEBUG(x) <empty-statement> #end
All that is required is
#define DEBUG(x) /* nothing here */
but I'm not sure how to implement the empty statement.. the problem, of course is in the extra semicolon when the macro is called as in, DEBUG(x); in release version.
The semicolon will not cause any problems since it is itself a valid "empty"
statement. For example
int foo(void)
{
int i; ; ; ;;;;
;
;;;;
for(i=0; i<10; ++i);
if(i > 10){
;
}
return i;
}
is perfectly legal. Now, imagine that each semicolon above which does not
terminate a statement is proceeded by DEBUG(whatever).
One of the possible solutions is to set
#define DEBUG(x) do{}while(0)
but I am not sure whether the compiler is smart enough to optimize this. Any other ideas, comments?
This statement should not be optimized away since the intent is to execute the
do-while *at least* once. This is actually a very good way to implement
debugging macros since it protects against the dangling else problem as well as
introduces a scope for debugging-specific variables. For example,
if(pred)
DEBUG(stuff);
else
return 0;
If you've defined
#define DEBUG(x) if(dbgEnabled) fprintf(stderr, "DBG: x=%d\n", x)
you'll run into problems.
/david
--
Andre, a simple peasant, had only one thing on his mind as he crept
along the East wall: 'Andre, creep... Andre, creep... Andre, creep.'
-- unknown
You, as well as Kenneth Brody and Gabriel are absolutely right.
For some reason I thought it was impossible to have hanging
semicolons. The next question is, assume I have the following code:
if (i == 0) DEBUG(1) ;
In the release version (DEBUG is an empty statement), will the
compiler create the "if i equals 0 then do nothing" or will it optimize
it out?
Thank you,
Maksim Sipos
"David Rubin" <no****@nowhere.net> wrote in message
news:c1********@netnews.proxy.lucent.com... Maksim Sipos wrote:
Hello, I would like to have something like
#ifdef VERSION_DEBUG #define DEBUG(x) DebugFnc(x) #end
#ifdef VERSION_RELEASE #define DEBUG(x) <empty-statement> #end All that is required is
#define DEBUG(x) /* nothing here */
but I'm not sure how to implement the empty statement.. the problem, of course is in the extra semicolon when the macro is called as in, DEBUG(x); in release version.
The semicolon will not cause any problems since it is itself a valid
"empty" statement. For example
int foo(void) { int i; ; ; ;;;; ; ;;;; for(i=0; i<10; ++i); if(i > 10){ ; } return i; }
is perfectly legal. Now, imagine that each semicolon above which does not terminate a statement is proceeded by DEBUG(whatever).
One of the possible solutions is to set
#define DEBUG(x) do{}while(0)
but I am not sure whether the compiler is smart enough to optimize this. Any other ideas, comments? This statement should not be optimized away since the intent is to execute
the do-while *at least* once. This is actually a very good way to implement debugging macros since it protects against the dangling else problem as
well as introduces a scope for debugging-specific variables. For example,
if(pred) DEBUG(stuff); else return 0;
If you've defined
#define DEBUG(x) if(dbgEnabled) fprintf(stderr, "DBG: x=%d\n", x)
you'll run into problems.
/david
-- Andre, a simple peasant, had only one thing on his mind as he crept along the East wall: 'Andre, creep... Andre, creep... Andre, creep.' -- unknown
Maksim Sipos wrote: [top-posted; he'll learn better, we hope] You, as well as Kenneth Brody and Gabriel are absolutely right. For some reason I thought it was impossible to have hanging semicolons. The next question is, assume I have the following code:
if (i == 0) DEBUG(1) ;
In the release version (DEBUG is an empty statement), will the compiler create the "if i equals 0 then do nothing" or will it optimize it out?
"Yes."
That is, it's up to the compiler, and a conforming
program can't tell whether the test was performed or not.
There are some situations where the test must *not*
be removed by optimization. Here are a few:
if (i == 0) ;
else puts ("Eeek!");
#define i putchar('\n')
if (i == 0) ;
volatile int i;
...
if (i == 0) ;
-- Er*********@sun.com
"Maksim Sipos" <ma*@sipos-software.com> wrote in message
news:2B*******************@twister.nyroc.rr.com... You, as well as Kenneth Brody and Gabriel are absolutely right. For some reason I thought it was impossible to have hanging semicolons. The next question is, assume I have the following code:
if (i == 0) DEBUG(1) ;
In the release version (DEBUG is an empty statement), will the compiler create the "if i equals 0 then do nothing" or will it optimize it out? Thank you, Maksim Sipos
/snip/
Well, optimizations are off-topic here, but you can probably
assume that a reasonably smart compiler will generate very
few, if any, instructions for "if (i == 0) ;".
--
----------------------------
Jeffrey D. Smith
Farsight Systems Corporation
24 BURLINGTON DRIVE
LONGMONT, CO 80501-6906 http://www.farsight-systems.com
z/Debug debugs your Systems/C programs running on IBM z/OS!
Are ISV upgrade fees too high? Check our custom product development!
On Fri, 20 Feb 2004 17:37:02 GMT, "Maksim Sipos"
<ma*@sipos-software.com> wrote: if (i == 0) DEBUG(1) ;
In the release version (DEBUG is an empty statement), will the compiler create the "if i equals 0 then do nothing" or will it optimize it out?
Ask the compiler ;-) Or ask on a newsgroup specific to the
implementation you're using. Unlike your first question, this one is
off-topic, since the C standard has nothing to say on the subject.
--
Al Balmer
Balmer Consulting re************************@att.net
"gabriel" <no@no--spam.com> wrote in message
news:d2**************************@msgid.meganewsse rvers.com... What about:
#define DEBUG(x) ;
[ In the following context:
#ifdef VERSION_DEBUG
#define DEBUG(x) DebugFnc(x)
#end
#ifdef VERSION_RELEASE
#define DEBUG(x) <empty-statement>
#end
]
Does this work?
Of course not. Try:
if (something_or_other)
DEBUG(x);
else
DEBUG(y);
Your solution translates to two semicolons, which in this case is a syntax
error.
To the OP: try something like:
#define DEBUG(x) ((void)0)
Neat, portable, syntactically safe and (generally) does not eat CPU cycles.
Peter
> if (i == 0) DEBUG(1) ; In the release version (DEBUG is an empty statement), will the compiler create the "if i equals 0 then do nothing" or will it optimize it out?
The question is: will it perform whatever is in the 'if' condition or
not?
If the compiler is half-decent, it will of course generate no code for
this, provided that the condition doesn't have any side effect. If it
does, the compiler *has* to generate the condition inside the 'if', but
it will not generate any "flow control" code (since there is no two
different paths).
In your example, if 'i' is a variable, the whole 'if' statement will
lead to no code at all. Now, if 'i' is actually a macro that could have
side effects, the compiler has to generate the code for this macro.
For instance:
if (printf("Hello.\n")) ;
The 'printf' call can't be "optimized out".
"Maksim Sipos" <ma*@sipos-software.com> wrote:
# Hello,
# I would like to have something like
#
# #ifdef VERSION_DEBUG
# #define DEBUG(x) DebugFnc(x)
# #end
#
# #ifdef VERSION_RELEASE
# #define DEBUG(x) <empty-statement>
If you're not satisfied with
#define DEBUG(x)
then you can use
#define DEBUG(x) 0
or
#define DEBUG(x) ((void)0)
if you have whiny compiler.
--
Derk Gwen http://derkgwen.250free.com/html/index.html
I think that's kinda of personal; I don't think I should answer that. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Dan |
last post by:
I was trying to troubleshoot a login page that doesn't work - it keeps
saying the login/password is missing - when my tracing discovered this
peculiar behavior.
register_globals is off, so at...
|
by: Emmanuel Thomé |
last post by:
This is a comment aside the empty class behavior FAQ.
I understand there are a fair number of reasons which make empty
classes have non-zero size (except as base classes). If ``class foo''
were...
|
by: Mark Turney |
last post by:
Problem:
I have a vector full of two different derived class objects (class B
and class C) that are derived from the same base class A. I want to
loop through vector and invoke a member function...
|
by: Dan Bass |
last post by:
which one do you use and why?
MyString == null || MyString == ""
vs
MyString == null || MyString.Length == 0
|
by: Joachim |
last post by:
Hi
I am a beginner in VB.NET, and have a problem with empty field in Access
I have transfered a worksheet in Excel to Access table. Some of the cels are empty
I use VB.NET program to acces...
|
by: Steve R. Hastings |
last post by:
So, Python 2.5 will have new any() and all() functions.
http://www.python.org/dev/peps/pep-0356/
any(seq) returns True if any value in seq evaluates true, False otherwise.
all(seq) returns...
|
by: lithoman |
last post by:
I'm stumped here. I run the procedure Batch_Select against the database
with @ID=18 and I get the expected data.
When it loads into a SqlDataReader, it gets messed up somehow.
Initially, after the...
|
by: Shum |
last post by:
Hi!
i have a question.. I'm filling a dataset from a table in which some
rows are empty, i dont want those empty records to be filled in the
dataset.. Does any one know how to restrict it to only...
|
by: talkaboutquality |
last post by:
Need to define a macro as, say,
#ifdef NEED_FUNCTION
foo(x)
#else
#endif
|
by: Sonnysonu |
last post by:
This is the data of csv file
1 2 3
1 2 3
1 2 3
1 2 3
2 3
2 3
3
the lengths should be different i have to store the data by column-wise with in the specific length.
suppose the i have to...
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
| |