It seems that sometimes concatenation with ## does work and sometimes it does not work.

It is an unreliable feature even though it is clearly vitally necessary for some uses.

Is there a clear set of rules for using ##?

An example is:

```
file1.h
#define concat(a,b) a##b
#define BAR bar
extern int concat(fu,BAR) ();

```

Here concat produces fuBAR not fubar.

An example is:

```
file2.h
#define BAR bar
extern int fu##BAR ();

```

Here ## produces an error about a stray ## in the code.