BRL-CAD
Loading...
Searching...
No Matches
common.h
Go to the documentation of this file.
1/* C O M M O N . H
2 * BRL-CAD
3 *
4 * Copyright (c) 2004-2026 United States Government as represented by
5 * the U.S. Army Research Laboratory.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public License
9 * version 2.1 as published by the Free Software Foundation.
10 *
11 * This library is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this file; see the file named COPYING for more
18 * information.
19 */
20
21/** @addtogroup common
22 *
23 * This header wraps system and compilation-specific defines from
24 * brlcad_config.h and removes need to conditionally include
25 * brlcad_config.h everywhere based on HAVE_CONFIG_H. The common
26 * definitions are symbols common to the platform being built that are
27 * either detected via configure or hand crafted, as is the case for
28 * the win32 platform.
29 *
30 * NOTE: In order to use compile-time API, applications need to define
31 * BRLCADBUILD and HAVE_CONFIG_H before including this header.
32 *
33 */
34/** @{ */
35/** @brief Header file for the BRL-CAD common definitions. */
36/** @file common.h */
37
38#ifndef COMMON_H
39#define COMMON_H
40
41/* include the venerable config.h file. use a pregenerated one for
42 * windows when we cannot auto-generate it easily. do not include
43 * config.h if this file has been installed. (public header files
44 * should not use config defines)
45 */
46#if defined(BRLCADBUILD) && defined(HAVE_CONFIG_H)
47
48# if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MINGW32__)
49# include "brlcad_config.h"
50 /* Put Windows config after brlcad_config.h, since some of the
51 * tests in it require defines from brlcad_config.h
52 */
53# include "config_win.h"
54# else
55# include "brlcad_config.h"
56# endif /* _WIN32 */
57
58/* Simulates drand48() functionality using rand() which is assumed to
59 * exist everywhere. The range is [0, 1).
60 */
61# if !defined(HAVE_DRAND48) && !defined(drand48)
62# define drand48() ((double)rand() / (double)(RAND_MAX + 1))
63# define HAVE_DRAND48 1
64# define srand48(seed) (srand(seed))
65# define HAVE_DECL_DRAND48 1
66# elif !defined(HAVE_DECL_DRAND48) && !defined(__cplusplus)
67extern double drand48(void);
68# endif
69
70# if !defined(__cplusplus) || defined(HAVE_SHARED_RINT_TEST)
71/* make sure lrint() is provided */
72# if !defined(lrint)
73# if !defined(HAVE_LRINT)
74# define lrint(_x) (((_x) < 0.0) ? (long int)ceil((_x)-0.5) : (long int)floor((_x)+0.5))
75# elif !defined(HAVE_WINDOWS_H) && !defined(HAVE_DECL_LRINT)
76long int lrint(double x);
77# define HAVE_DECL_LRINT 1
78# endif
79# endif
80
81# if !defined(HAVE_LRINT)
82# define HAVE_LRINT 1
83# endif
84
85/* make sure rint() is provided */
86# if !defined(rint)
87# if !defined(HAVE_RINT)
88# define rint(_x) (((_x) < 0.0) ? ceil((_x)-0.5) : floor((_x)+0.5))
89# elif !defined(HAVE_WINDOWS_H) && !defined(HAVE_DECL_RINT)
90double rint(double x);
91# define HAVE_DECL_RINT 1
92# endif
93# endif
94
95# if !defined(HAVE_RINT)
96# define HAVE_RINT 1
97# endif
98# endif
99
100/* Make sure THREADLOCAL is defined, only usable on C "POD" types.
101 *
102 * Apparently MSVC doesn't set the __cplusplus version correctly unless a
103 * compiler flag is passed. Check the _MSVC_LANG variable as well to
104 * correctly use thread_local in that context. Since THREADLOCAL is defined as
105 * usable only with POD the declspec form will also work, but we want to use
106 * the standardized version when available.*/
107#ifndef THREADLOCAL
108# if (defined(__cplusplus) && __cplusplus >= 201103L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
109# define THREADLOCAL thread_local // C++11 or newer: thread_local is standard
110# elif !defined(__cplusplus) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L
111# define THREADLOCAL thread_local // C23: thread_local is standard
112# elif !defined(__cplusplus) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
113# define THREADLOCAL _Thread_local // C11: _Thread_local is standard
114# elif defined(HAVE_WINDOWS_H)
115# define THREADLOCAL __declspec(thread) // NOTE: POD only. thread_local is more capable
116# elif defined(__GNUC__) || defined(__clang__)
117# define THREADLOCAL __thread
118# else
119# error "Cannot define THREADLOCAL for this compiler/platform"
120# endif
121#endif
122
123/* strict c89 doesn't declare snprintf() */
124# if defined(HAVE_SNPRINTF) && !defined(HAVE_DECL_SNPRINTF) && !defined(snprintf) && !defined(__cplusplus)
125# include <stddef.h> /* for size_t */
126extern int snprintf(char *str, size_t size, const char *format, ...);
127# endif
128
129#endif /* BRLCADBUILD & HAVE_CONFIG_H */
130
131/* provide declaration markers for header externals */
132#ifndef __BEGIN_DECLS
133# ifdef __cplusplus
134# define __BEGIN_DECLS extern "C" { /**< if C++, set to extern "C" { */
135# define __END_DECLS } /**< if C++, set to } */
136# else
137# define __BEGIN_DECLS /**< if C++, set to extern "C" { */
138# define __END_DECLS /**< if C++, set to } */
139# endif
140#endif
141
142/* Because extern "C" doesn't work if we are compiling in C, if we want to
143 * specifically denote individual functions for C symbol export in both C and
144 * C++ compilation we need a conditional expression. __BEGIN_DECLS normally
145 * serves this purpose in BRL-CAD code, but for function signatures its bracket
146 * syntax isn't appropriate. We therefore define a second utility for the
147 * function declaration case: */
148#ifndef C_DECL
149# ifdef __cplusplus
150# define C_DECL extern "C" /**< if C++, set to extern "C" */
151# else
152# define C_DECL /**< if C define empty */
153# endif
154#endif
155
156
157/* ANSI c89 does not allow the 'inline' keyword, check if GNU inline
158 * rules are in effect.
159 *
160 * TODO: test removal of __STRICT_ANSI__ on Windows.
161 */
162#if !defined __cplusplus && (defined(__STRICT_ANSI__) || defined(__GNUC_GNU_INLINE__))
163# ifndef inline
164# define inline /***/
165# endif
166#endif
167
168/** Find and return the maximum value */
169#ifndef FMAX
170# define FMAX(a, b) (((a)>(b))?(a):(b))
171#endif
172/** Find and return the minimum value */
173#ifndef FMIN
174# define FMIN(a, b) (((a)<(b))?(a):(b))
175#endif
176
177/* make sure the old bsd types are defined for portability */
178#if defined(BRLCADBUILD) && defined(HAVE_CONFIG_H)
179# if !defined(HAVE_U_TYPES)
180typedef unsigned char u_char;
181typedef unsigned int u_int;
182typedef unsigned long u_long;
183typedef unsigned short u_short;
184# define HAVE_U_TYPES 1
185# endif
186#endif
187
188/* We want 64 bit (large file) I/O capabilities whenever they are available.
189 * Always define this before we include sys/types.h */
190#ifndef _FILE_OFFSET_BITS
191# define _FILE_OFFSET_BITS 64
192#endif
193
194/**
195 * make sure ssize_t is provided. C99 does not provide it even though it is
196 * defined in SUS97. if not available, we create the type aligned with the
197 * similar POSIX ptrdiff_t type.
198 */
199#if defined(_MSC_VER) && !defined(HAVE_SSIZE_T)
200# ifdef HAVE_SYS_TYPES_H
201# include <sys/types.h>
202# endif
203# include <limits.h>
204# include <stddef.h>
205typedef ptrdiff_t ssize_t;
206# define HAVE_SSIZE_T 1
207# ifndef SSIZE_MAX
208# if defined(LONG_MAX)
209# define SSIZE_MAX LONG_MAX
210# elif defined(INT_MAX)
211# define SSIZE_MAX INT_MAX
212# elif defined(_POSIX_SSIZE_MAX)
213# define SSIZE_MAX _POSIX_SSIZE_MAX
214# else
215 /* Go with POSIX minimum acceptable value. This is smaller than
216 * we would like, but is a safe default value.
217 */
218# define SSIZE_MAX 32767
219# endif
220# endif
221#endif
222
223/* make sure most of the C99 stdint types are provided including the
224 * optional uintptr_t type.
225 */
226#if !defined(INT8_MAX) || !defined(INT16_MAX) || !defined(INT32_MAX) || !defined(INT64_MAX)
227# if (defined _MSC_VER && (_MSC_VER <= 1500))
228 /* Older Versions of Visual C++ seem to need pstdint.h but still
229 * pass the tests below, so force it based on version (ugh.)
230 */
231# include "pstdint.h"
232# elif defined(__STDC__) || defined(__STRICT_ANSI__) || defined(__SIZE_TYPE__) || defined(HAVE_STDINT_H)
233# if !defined(__STDC_LIMIT_MACROS)
234# define __STDC_LIMIT_MACROS 1
235# endif
236# if !defined(__STDC_CONSTANT_MACROS)
237# define __STDC_CONSTANT_MACROS 1
238# endif
239# include <stdint.h>
240# else
241# include "pstdint.h"
242# endif
243#endif
244
245/* off_t is 32 bit size even on 64 bit Windows. In the past we have tried to
246 * force off_t to be 64 bit but this is failing on newer Windows/Visual Studio
247 * versions in 2020 - therefore, we instead introduce the b_off_t define to
248 * properly substitute the correct numerical type for the correct platform. */
249#if defined(_WIN64)
250# include <sys/stat.h>
251# define b_off_t __int64
252# define fstat _fstati64
253# define stat _stati64
254#elif defined (_WIN32)
255# include <sys/stat.h>
256# define b_off_t _off_t
257# define fstat _fstat
258# define stat _stat
259#else
260# define b_off_t off_t
261#endif
262
263/**
264 * Maximum length of a filesystem path. Typically defined in a system
265 * file but if it isn't set, we create it.
266 */
267#ifndef MAXPATHLEN
268# include <limits.h> // Consistently define (or not) PATH_MAX
269# ifdef PATH_MAX
270# define MAXPATHLEN PATH_MAX
271# elif defined(MAX_PATH)
272# define MAXPATHLEN MAX_PATH
273# elif defined(_MAX_PATH)
274# define MAXPATHLEN _MAX_PATH
275# else
276# define MAXPATHLEN 2048
277# endif
278#endif
279
280/**
281 * Provide a means to conveniently test the version of the GNU
282 * compiler. Use it like this:
283 *
284 * @code
285 * #if GCC_PREREQ(2,8)
286 * ... code requiring gcc 2.8 or later ...
287 * #endif
288 * @endcode
289 *
290 * WARNING: THIS MACRO IS CONSIDERED PRIVATE AND SHOULD NOT BE USED
291 * OUTSIDE OF THIS HEADER FILE. DO NOT RELY ON IT.
292 */
293#ifdef GCC_PREREQ
294# warning "GCC_PREREQ unexpectedly defined. Ensure common.h is included first."
295# undef GCC_PREREQ
296#endif
297#if defined __GNUC__
298# define GCC_PREREQ(major, minor) __GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))
299#else
300# define GCC_PREREQ(major, minor) 0
301#endif
302
303/**
304 * Provide a means to conveniently test the version of the Intel
305 * compiler. Use it like this:
306 *
307 * @code
308 * #if ICC_PREREQ(800)
309 * ... code requiring icc 8.0 or later ...
310 * #endif
311 * @endcode
312 *
313 * WARNING: THIS MACRO IS CONSIDERED PRIVATE AND SHOULD NOT BE USED
314 * OUTSIDE OF THIS HEADER FILE. DO NOT RELY ON IT.
315 */
316/* provide a means to conveniently test the version of ICC */
317#ifdef ICC_PREREQ
318# warning "ICC_PREREQ unexpectedly defined. Ensure common.h is included first."
319# undef ICC_PREREQ
320#endif
321#if defined __INTEL_COMPILER
322# define ICC_PREREQ(version) (__INTEL_COMPILER >= (version))
323#else
324# define ICC_PREREQ(version) 0
325#endif
326
327/* This is so we can use gcc's "format string vs arguments"-check for
328 * various printf-like functions, and still maintain compatibility.
329 */
330#ifndef __attribute__
331/* This feature is only available in gcc versions 2.5 and later. */
332# if !GCC_PREREQ(2, 5)
333# define __attribute__(ignore) /* empty */
334# endif
335/* The __-protected variants of `format' and `printf' attributes
336 * are accepted by gcc versions 2.6.4 (effectively 2.7) and later.
337 */
338# if !GCC_PREREQ(2, 7)
339# define __format__ format
340# define __printf__ printf
341# define __noreturn__ noreturn
342# endif
343#endif
344
345/* gcc 3.4 doesn't seem to support always_inline with -O0 (yet -Os
346 * reportedly works), so turn it off.
347 */
348#if !GCC_PREREQ(3, 5)
349# define always_inline noinline
350#endif
351
352/**
353 * UNUSED provides a common mechanism for declaring unused parameters.
354 * Use it like this:
355 *
356 * int
357 * my_function(int argc, char **UNUSED(argv))
358 * {
359 * ...
360 * }
361 *
362 */
363#ifdef UNUSED
364# warning "UNUSED unexpectedly defined. Ensure common.h is included first."
365# undef UNUSED
366#endif
367#if GCC_PREREQ(2, 5)
368/* GCC-style compilers have an attribute */
369# define UNUSED(parameter) UNUSED_ ## parameter __attribute__((unused))
370#elif defined(__cplusplus)
371/* C++ allows the name to go away */
372# define UNUSED(parameter) /* parameter */
373#else
374/* some are asserted when !NDEBUG */
375# define UNUSED(parameter) (parameter)
376#endif
377
378/**
379 * LIKELY provides a common mechanism for providing branch prediction
380 * hints to the compiler so that it can better optimize. It should be
381 * used when it's exceptionally likely that an expected code path will
382 * almost always be executed. Use it like this:
383 *
384 * if (LIKELY(x == 1)) {
385 * ... expected code path ...
386 * }
387 *
388 */
389#ifdef LIKELY
390# undef LIKELY
391# warning "LIKELY unexpectedly defined. Ensure common.h is included first."
392#endif
393#if GCC_PREREQ(3, 0) || ICC_PREREQ(800)
394# define LIKELY(expression) __builtin_expect((expression), 1)
395#else
396# define LIKELY(expression) (expression)
397#endif
398
399/**
400 * UNLIKELY provides a common mechanism for providing branch
401 * prediction hints to the compiler so that it can better optimize.
402 * It should be used when it's exceptionally unlikely that a given code
403 * path will ever be executed. Use it like this:
404 *
405 * if (UNLIKELY(x == 0)) {
406 * ... unexpected code path ...
407 * }
408 *
409 */
410#ifdef UNLIKELY
411# undef UNLIKELY
412# warning "UNLIKELY unexpectedly defined. Ensure common.h is included first."
413#endif
414#if GCC_PREREQ(3, 0) || ICC_PREREQ(800)
415# define UNLIKELY(expression) __builtin_expect((expression), 0)
416#else
417# define UNLIKELY(expression) (expression)
418#endif
419
420/**
421 * DEPRECATED provides a common mechanism for denoting public API
422 * (e.g., functions, typedefs, variables) that is considered
423 * deprecated. Use it like this:
424 *
425 * DEPRECATED int my_function(void);
426 *
427 * typedef struct karma some_type DEPRECATED;
428 */
429#ifdef DEPRECATED
430# undef DEPRECATED
431# warning "DEPRECATED unexpectedly defined. Ensure common.h is included first."
432#endif
433#if GCC_PREREQ(3, 1) || ICC_PREREQ(800)
434# define DEPRECATED __attribute__((deprecated))
435#elif defined(_WIN32)
436# define DEPRECATED __declspec(deprecated("This function is DEPRECATED. Please update code to new API."))
437#else
438# define DEPRECATED /* deprecated */
439#endif
440
441
442/**
443 * NORETURN declares that a function does not return.
444 *
445 * For portability, the attribute must precede the function, i.e., be
446 * declared on the left:
447 *
448 * NORETURN void function(void);
449 *
450 * Note that throwing an exception or calling longjmp() do not
451 * constitute a return. Functions that (always) infinite loop can be
452 * considered functions that do not return. Functions that do not
453 * return should have a void return type. This option is a hint to
454 * compilers and static analyzers, to reduce false positive reporting.
455 */
456#ifdef NORETURN
457# undef NORETURN
458# warning "NORETURN unexpectedly defined. Ensure common.h is included first."
459#endif
460#if defined(HAVE_NORETURN_ATTRIBUTE)
461# define NORETURN __attribute__((__noreturn__))
462#elif defined(HAVE_NORETURN_DECLSPEC)
463# define NORETURN __declspec(noreturn)
464#else
465# define NORETURN /* does not return */
466#endif
467
468
469/**
470 * FAUX_NORETURN declares a function should be treated as if it does
471 * not return, even though it can.
472 *
473 * As this label is (currently) Clang-specific, it can be declared on
474 * the left or right of a function declaration. Left is recommended
475 * for consistency with other annotations, e.g.:
476 *
477 * FAUX_NORETURN void function(void);
478 *
479 * This annocation is almost identical to NORETURN except that it does
480 * not affect code generation and can be used on functions that
481 * actually return. It's typically useful for annotating assertion
482 * handlers (e.g., assert()) that sometimes return and should not be
483 * used on NORETURN functions. This annotation is primarily a hint to
484 * static analyzers.
485 */
486#ifdef FAUX_NORETURN
487# undef FAUX_NORETURN
488# warning "FAUX_NORETURN unexpectedly defined. Ensure common.h is included first."
489#endif
490#ifdef HAVE_ANALYZER_NORETURN_ATTRIBUTE
491# define FAUX_NORETURN __attribute__((analyzer_noreturn))
492#else
493# define FAUX_NORETURN /* pretend does not return */
494#endif
495
496
497/* ActiveState Tcl doesn't include this catch in tclPlatDecls.h, so we
498 * have to add it for them
499 */
500#if defined(_MSC_VER) && defined(__STDC__)
501# include <tchar.h>
502/* MSVC++ misses this. */
503typedef _TCHAR TCHAR;
504#endif
505
506/* Avoid -Wundef warnings for system headers that use __STDC_VERSION__ without
507 * checking if it's defined.
508 */
509#if !defined(__STDC_VERSION__)
510# define __STDC_VERSION__ 0
511#endif
512
513
514/* workaround for system Eigen on Mac which uses alloca without proper includes */
515#if defined(__APPLE__) && !defined(alloca)
516# define alloca(x) malloc(x)
517#endif
518
519/**
520 * globally disable certain warnings. do NOT add new warnings here
521 * without discussion and research. only warnings that cannot be
522 * quieted without objectively decreasing code quality should be
523 * added! even warnings that are innocuous or produce false-positive
524 * should be quelled when possible.
525 *
526 * any warnings added should include a description and justification.
527 */
528#if defined(_MSC_VER)
529
530/* /W1 warning C4351: new behavior: elements of array '...' will be default initialized
531 *
532 * i.e., this is the "we now implement constructor member
533 * initialization correctly" warning that tells the user an
534 * initializer like this:
535 *
536 * Class::Class() : some_array() {}
537 *
538 * will now initialize all members of some_array. previous to
539 * MSVC2005, behavior was to not initialize in some cases...
540 */
541# pragma warning( disable : 4351 )
542
543/* warning C5105: macro expansion producing 'defined' has undefined behavior
544 *
545 * this appears to be an erroneous issue in the latest msvc
546 * pre-processor that has support for the new C17 standard, which
547 * triggers warnings in Windows SDK headers (e.g., winbase.h) that
548 * use the defined operator in certain macros.
549 */
550# pragma warning( disable : 5105 )
551
552/* dubious warnings that are not yet intentionally disabled:
553 *
554 * /W3 warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
555 *
556 * this warning is caused by assigning an int (or other non-boolean
557 * value) to a bool like this:
558 *
559 * int i = 1; bool b = i;
560 *
561 * there is something to be said for making such assignments explicit,
562 * e.g., "b = (i != 0);", but this arguably decreases readability or
563 * clarity and the fix has potential for introducing logic errors.
564 */
565/*# pragma warning( disable : 4800 ) */
566
567#endif
568
569/**
570 * Provide a macro for different treatment of initialized extern const
571 * variables between C and C++. In C the following initialization
572 * (definition) is acceptable for external linkage:
573 *
574 * const int var = 10;
575 *
576 * but in C++ const is implicitly internal linkage so it must have
577 * extern qualifier:
578 *
579 * extern const int var = 10;
580 *
581 * In a lot of situations you can just use "extern" for both C and
582 * C++, but there are some trickier cases (src/rt is one example)
583 * where it is simpler to do things this way.
584 */
585#if defined(__cplusplus)
586# define EXTERNCPP extern
587#else
588# define EXTERNCPP
589#endif
590
591/**
592 * Provide canonical preprocessor stringification.
593 *
594 @code
595 * #define abc 123
596 * CPP_STR(abc) => "abc"
597 @endcode
598 */
599#ifndef CPP_STR
600# define CPP_STR(x) # x
601#endif
602
603/**
604 * Provide canonical preprocessor expanded stringification.
605 *
606 @code
607 * #define abc 123
608 * CPP_XSTR(abc) => "123"
609 @endcode
610 */
611#ifndef CPP_XSTR
612# define CPP_XSTR(x) CPP_STR(x)
613#endif
614
615/**
616 * Provide canonical preprocessor concatenation.
617 *
618 @code
619 * #define abc 123
620 * CPP_GLUE(abc, 123) => abc123
621 * CPP_STR(CPP_GLUE(abc, 123)) => "CPP_GLUE(abc, 123)"
622 * CPP_XSTR(CPP_GLUE(abc, 123)) => "abc123"
623 * #define abc123 "xyz"
624 * CPP_GLUE(abc, 123) => abc123 => "xyz"
625 @endcode
626 */
627#ifndef CPP_GLUE
628# define CPP_GLUE(a, b) a ## b
629#endif
630
631/**
632 * Provide canonical preprocessor expanded concatenation.
633 *
634 @code
635 * #define abc 123
636 * CPP_XGLUE(abc, 123) => 123123
637 * CPP_STR(CPP_XGLUE(abc, 123)) => "CPP_XGLUE(abc, 123)"
638 * CPP_XSTR(CPP_XGLUE(abc, 123)) => "123123"
639 @endcode
640 */
641#ifndef CPP_XGLUE
642# define CPP_XGLUE(a, b) CPP_GLUE(a, b)
643#endif
644
645/**
646 * Provide format specifier string tied to a size (e.g., "%123s")
647 *
648 @code
649 * #define STR_LEN 10+1
650 * char str[STR_LEN] = {0};
651 * scanf(CPP_SCANSIZE(STR_LEN) "\n", str);
652 @endcode
653 */
654#ifndef CPP_SCAN
655# define CPP_SCAN(sz) "%" CPP_XSTR(sz) "s"
656#endif
657
658/**
659 * Provide the current filename and linenumber as a static
660 * preprocessor string in "file"":""line" format (e.g., "file:123").
661 */
662#ifndef CPP_FILELINE
663# define CPP_FILELINE __FILE__ ":" CPP_XSTR(__LINE__)
664#endif
665
666/**
667 * If we've not already defined COMPILER_DLLEXPORT and COMPILER_DLLIMPORT,
668 * define them away so code including the *_EXPORT header logic won't
669 * fail.
670 */
671#if defined(_MSC_VER)
672# define COMPILER_DLLEXPORT __declspec(dllexport)
673# define COMPILER_DLLIMPORT __declspec(dllimport)
674#elif defined(__GNUC__) || defined(__clang__)
675# define COMPILER_DLLEXPORT __attribute__ ((visibility ("default")))
676# define COMPILER_DLLIMPORT __attribute__ ((visibility ("default")))
677#else
678# define COMPILER_DLLEXPORT
679# define COMPILER_DLLIMPORT
680#endif
681
682#endif /* COMMON_H */
683
684/** @} */
685/*
686 * Local Variables:
687 * mode: C
688 * tab-width: 8
689 * indent-tabs-mode: t
690 * c-file-style: "stroustrup"
691 * End:
692 * ex: shiftwidth=4 tabstop=8
693 */
Definition dvec.h:74