[petsc-users] Putting petsc in a namespace

Florian Lindner mailinglists at xgm.de
Mon Sep 8 02:19:21 CDT 2014


Hi there, ...

Am 05.09.2014 18:00, schrieb Jed Brown:
> Florian Lindner <mailinglists at xgm.de> writes:
> 
>> Hello,
>> 
>> This may be rather a C/C++ question, but ...
>> 
>> I encapsulate some petsc functions into c++ classes. Since I don't 
>> want
>> to pull all petsc symbols into the global namespace for anyone using 
>> my
>> classes I try to put petsc into it's own namespace:
>> 
>> Header petsc.h:
> 
> Note that there is already a petsc.h in the PETSc distribution.  It is
> different from yours.

Ok, that may not be causing problems here, but it will certainly cause 
problems in the future, renamed it to petnum.h / .cpp. Thx!

>> namespace petsc {
>> #include "petscmat.h"
>> }
>> 
>> class Vector {
>>    petsc::Vec vector;
>> }
>> 
>> 
>> Implementation petsc.cpp:
>> 
>> #include "petsc.h"
>> 
>> namespace petsc {
>> #include "petscviewer.h"
>> }
>> 
>> using namespace petsc;
>> 
>> 
>> User:
>> 
>> #include "petsc.h"
>> #include <petscksp.h>  // if the user wants he can import parts of 
>> petsc
>> of course
>> 
>> 
>> But this gives a massive amount of error messsages like:
>> 
>> mpic++ -o petsc.o -c -O0 -g3 -Wall
>> -I/home/florian/software/petsc/include
>> -I/home/florian/software/petsc/arch-linux2-c-debug/include petsc.cpp
>> mpic++ -o prbf.o -c -O0 -g3 -Wall 
>> -I/home/florian/software/petsc/include
>> -I/home/florian/software/petsc/arch-linux2-c-debug/include prbf.cpp
>> In file included from
>> /home/florian/software/petsc/include/petscksp.h:6:0,
>>                   from prbf.cpp:9:
>> /home/florian/software/petsc/include/petscpc.h:9:14: error:
>> 'PetscErrorCode' does not name a type
>>   PETSC_EXTERN PetscErrorCode PCInitializePackage(void);
> 
> What do you expect when you put some things in the namespace and 
> include
> dependencies outside the namespace?

Well, I have these symbols in the petsc and in the global namespace.

> namespaces don't play well with macros (including header guards).  I
> don't think what you are attempting is a good use of time, but if you 
> do
> it, I would recommend creating a public interface that does not include
> any PETSc headers, thus completely hiding the PETSc interface.

I want to offer an interface that uses some Petsc types (like Vec and 
Mat) but I do not want to import all petsc symbols into the global 
namespace for anyone using the interface. That does not seam possible 
though...

Thanks,

Florian


More information about the petsc-users mailing list