GRASS and C++: Difference between revisions

From GRASS-Wiki
Jump to navigation Jump to search
(fix from Glynn (ML))
Line 23: Line 23:


<source lang="c">
<source lang="c">
extern "C"  
#ifdef __cplusplus
{
extern "C" {
#include <grass/gis.h>
#endif
 
...
 
#ifdef __cplusplus
}
}
#endif
</source>
</source>


The C++ compiler will understand that the functions defined in gis.h are coded in C. If it is not specified the linking step will throw an error stating that the symbols for the C functions were not found in the shared library.
The C++ compiler will understand that the functions defined in gis.h are coded in C. If it is not specified the linking step will throw an error stating that the symbols for the C functions were not found in the shared library. Without the 'extern "C" ...' qualification, C++ assumes that functions have C++ linkage, meaning that the parameter types are embedded in the symbol name (C++ allows function overloading, where multiple functions can have the same name provided that they have different parameter types).


== See also ==
== See also ==

Revision as of 22:44, 8 May 2012

(page to be expanded)

Calling GRASS library functionality in C++

For working examples, see:

I/O:

Raster data processing

Image processing

Visualization:

Notes

C++ code that use C shared libraries needs to specify this fact to the compiler. This can be defined with the extern "C" keyword, in this way:

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif

The C++ compiler will understand that the functions defined in gis.h are coded in C. If it is not specified the linking step will throw an error stating that the symbols for the C functions were not found in the shared library. Without the 'extern "C" ...' qualification, C++ assumes that functions have C++ linkage, meaning that the parameter types are embedded in the symbol name (C++ allows function overloading, where multiple functions can have the same name provided that they have different parameter types).

See also