You could consider ctags, available on many platforms. The output is easily parsable, and full of info you required.
more info
For your question, I had to look to the many options available, and after a little I found it. For example:
ctags -N -x --c-kinds=+p crowd.*
produces this output
CrowdSim class 44 crowd.h class CrowdSim
CrowdSim function 47 crowd.h CrowdSim( const std::string& contentDir ) : _contentDir( contentDir ) {}
Particle function 35 crowd.h Particle()
Particle struct 25 crowd.h struct Particle
_contentDir member 56 crowd.h std::string _contentDir;
_crowd_H_ macro 18 crowd.h #define _crowd_H_
_particles member 57 crowd.h std::vector< Particle > _particles;
animTime member 32 crowd.h float animTime;
chooseDestination function 24 crowd.cpp void CrowdSim::chooseDestination( Particle &p )
chooseDestination prototype 53 crowd.h void chooseDestination( Particle &p );
dx member 28 crowd.h float dx, dz; // Destination position
dz member 28 crowd.h float dx, dz; // Destination position
fx member 29 crowd.h float fx, fz; // Force on particle
fz member 29 crowd.h float fx, fz; // Force on particle
init function 35 crowd.cpp void CrowdSim::init()
init prototype 49 crowd.h void init();
node member 31 crowd.h H3DNode node;
ox member 30 crowd.h float ox, oz; // Orientation vector
oz member 30 crowd.h float ox, oz; // Orientation vector
px member 27 crowd.h float px, pz; // Current postition
pz member 27 crowd.h float px, pz; // Current postition
update function 68 crowd.cpp void CrowdSim::update( float fps )
update prototype 50 crowd.h void update( float fps );
(note: -x is only for easy user inspection)