![]() Chapter Contents  | 
![]() Previous  | 
![]() Next  | 
| isnotconst isnumconst isstrconst | 
| isnotconst: | Test for Nonconstant | 
| isnumconst: | Test for Numeric Constant | 
| isstrconst: | Test for String Literal | 
| Portability: | SAS/C extension | 
| SYNOPSIS | |
| DESCRIPTION | |
| EXAMPLES | 
| SYNOPSIS | 
#include <lcdef.h> int isnotconst(expression); int isnumconst(expression); int isstrconst(expression);
| DESCRIPTION | 
These macros examine 
expression
 and return a compile-time constant. If 
expression
 is the appropriate type of constant, a nonzero constant
is returned; otherwise, 0 is returned.  The type  tested for is numeric for 
isnumconst
, string literal for 
isstrconst
, and nonconstant for 
isnotconst
.  The 
expression
 constant can have
any type.
expression
 is never
evaluated, and these macros always yield a constant, regardless of the type
of 
expression
.
The 
isnotcons
, 
isnumconst
, and 
isstrconst
 macros are used primarily to control the generation of code
by in-line functions. Because they produce compile-time constants, the macros
can be tested at compile time, enabling the compiler to eliminate  sections
of code that can never be executed.
| EXAMPLES | 
Below are several examples using these nonstandard macros:
if (isnotconst(argv[]))                 /* true  */
if (isnumconst(100))                    /* true  */
if (isstrconst("XYZ"))                  /* true  */
if (isstrconst(c == 0 ? "A" : "B")      /* false */
#define MAXLEN 1024 if (isnumconst(MAXLEN) && 500 < MAXLEN) /* true */
This example defines the function 
smemcpy
 (meaning short 
memcpy
) that
prevents the expansion of the built-in 
memcpy
 function unless the length argument is a constant integer less than
or equal to 256. If the length argument is greater than 256 or is not a constant
integer, a call to the true 
memcpy
 function
is generated.
The 
if
 condition
is a constant expression and is evaluated at compile time. The compiler generates
code either for the 
then
 branch or the 
else
 branch, depending on the result of the test.
Under no conditions is code for both branches generated.
#include <lcdef.h>
#include <string.h>
#define smemcpy(d, s, len)
        inline_memcpy(d, s, len, isnumconst(len))
_ _inline
void *inline_memcpy(void *d, const void *s,
                    size_t len, int cnst)
{
   if (cnst && len < 257)
      memcpy(d, s, len);
   else
      (memcpy)(d, s, len);
   return d;
}
![]() Chapter Contents  | 
![]() Previous  | 
![]() Next  | 
![]() Top of Page  | 
Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.