[nycbug-talk] invalid type argument of '->'

Marc Spitzer mspitzer at gmail.com
Fri Mar 21 15:16:13 EDT 2008

On Fri, Mar 21, 2008 at 1:07 PM, Tim A. <techneck at goldenpath.org> wrote:
>  Tim A. wrote:
>  Michael Hernandez wrote:
>  On Mar 18, 2008, at 3:36 PM, Marc Spitzer wrote:
>  On Tue, Mar 18, 2008 at 2:46 PM, Michael Hernandez
> <mhernandez at techally.com> wrote:
>  I am trying to build the php5-spl port and I keep getting errors like
> this:
> /usr/ports/devel/php5-spl/work/php-5.2.5/ext/spl/php_spl.c:61: error:
> invalid type argument of `->'
> I looked at php_spl.c - I don't see what's wrong with it. The line
> is:
> spl_globals->autoload_extensions = NULL;
> Is that not valid code? Is my gcc just old? I'm running out of ideas
> here. Any help would be appreciated.
>  is spl_globals a pointer? Stupid question but it is complaining that
> it can not do a pointer dereference and access structure field.
> marc
>  To be quite honest, I'm not sure - I guess the PHP hackers might be
> too used to hacking in PHP and so their C is getting sloppy? Which
> isn't good since PHP is written in C, not PHP. :)
>  I just gave it a go. Installed from port just fine on 6.2.
>  Stupid question, but have you tried a portsnap?
>  I've been brushing up on my C lately. (btw, O'Reilly's C Pocket Reference
> is really good.)
>  So, Mark's pointer question got me curious and I thought I'd look it up.
>  It seems easy enough to determine.
>  Assuming we're in /usr/ports/devel/php5-spl
>  After you've at least attempted to install the port once, you should have a
> directory called work.
>  # find work -type f -exec grep -Hn spl_globals {} \;

if you want to poke around install the cscope port and use it, you *really*
want to do this.

>  Which indicates as I might have suspected, the answer is in php_spl.h
>  I think the following lines indicate that spl_globals is a pointer variable
> of type zend_spl_globals which would appear to be a pointer to a structure
> but I can't find where zend_spl_globals is implemented. It seems to not be
> in these source files.

check the installed php stuff, /usr/local/include

>  #ifdef ZTS
>  # define SPL_G(v) TSRMG(spl_globals_id, zend_spl_globals *, v)
>  extern int spl_globals_id;
>  #else
>  # define SPL_G(v) (spl_globals.v)
>  extern zend_spl_globals spl_globals;
>  #endif
>  I don't understand preprocessing though. So, I'm not sure exactly what the
> # define lines mean or how they work. (Coming up to that part).
>  Only thing I ever used those for were including standard headers.

C's macro preprocessor is not complicated, the above translates to:

if the thing ZTS is defined, somewhere above "#define ZTS 'something'
" was encountered do the first half otherwise do the second half.  And
if you want to do C and don't already have it get the current version
of K&R.  By do I mean put a chunk of text in the output file, as cpp
handles all the #commands and macro substitution.

Also keep in mind that the compiler, when it actually compiles,
expects one big file to munch on, #include for example does not tell
the compiler to look here so much to include this file in the current
one here.  I do not know if gcc actually does that, if you get it to
dump the cpp output it will tell you, but conceptually that is what C

Happy hacking,

Freedom is nothing but a chance to be better.
Albert Camus

More information about the talk mailing list