Using the ## preprocessing operator fails
Jonathan Wakely
jwakely.gcc@gmail.com
Fri Aug 26 17:08:00 GMT 2011
On 26 August 2011 15:54, Ike Starnes wrote:
>
> The following code builds fine in Microsoft C, but fails with gcc / g++:
>
>
> #include <iostream>
>
> using namespace std;
>
> typedef struct _THREADDATA
> {
> int nConvTiles; // the number of swap buffers in a tiled bitmap
> used for caching the disk tiles (default 1)
> }
> THREADDATA, *pTHREADDATA;
>
> #define DECLARETHREADDATA() pTHREADDATA pThreadData = NULL;
> #define GETTHREADDATA() pThreadData
> #define THREADVALUE(v) GETTHREADDATA()->##v
>
> static int GetTilesInfo()
> {
> DECLARETHREADDATA();
> int nConvTiles;
> nConvTiles = THREADVALUE(nConvTiles);
> return nConvTiles;
> }
>
> int main()
> {
> cout << "Hello world!" << endl;
> cout << GetTilesInfo();
> return 0;
> }
>
>
> With gcc, the error is:
> d:\temp\GNU\HelloWorld\main.cpp:19:1: error: pasting "->" and "nConvTiles"
> does not give a valid preprocessing token
>
> Does anyone know the correct fix?
Just remove the ## from your macro.
## is for pasting two tokens together into one, but in your macro
there's only one token. Just get rid of it and it will work:
#define THREADVALUE(v) GETTHREADDATA()->v
More information about the Gcc-help
mailing list