Take the following three lines of code. Please note it is haskell code not C however that is irrelevant since this is a preprocessor issue:
$ cat nl-escape.hs -- stuff infix 5 \\ -- more stuff $ Please note, there is a single space after the double backslash. using gcc-3.4.3: $ gcc-3.4.3 -v Reading specs from /tool/gcc-3.4.3/i486-Linux/bin/../lib/gcc/i486-linux/3.4.3/specs Configured with: ../gcc-3.4.3/configure --host=i486-linux --prefix=/tool/gcc-3.4.3 --exec-prefix=/tool/gcc-3.4.3/i486-Linux/ Thread model: posix gcc version 3.4.3 $ gcc-3.4.3 -P -E -traditional-cpp -xc nl-escape.hs nl-escape.hs:2: warning: backslash and newline separated by space -- stuff infix 5 \-- more stuff $ gcc-3.4.3 -P -E -xc nl-escape.hs -- stuff nl-escape.hs:2:10: warning: backslash and newline separated by space infix 5 \-- more stuff using gcc-3.3.4: $ gcc-3.3.4 -v Reading specs from /usr/lib/gcc-lib/i486-slackware-linux/3.3.4/specs Configured with: ../gcc-3.3.4/configure --prefix=/usr --enable-shared --enable-threads=posix --enable-__cxa_atexit --disable-checking --with-gnu-ld --verbose --target=i486-slackware-linux --host=i486-slackware-linux Thread model: posix gcc version 3.3.4 $ gcc-3.3.4 -P -E -traditional-cpp -xc nl-escape.hs -- stuff infix 5 \\ -- more stuff $ gcc-3.3.4 -P -E -xc nl-escape.hs -- stuff nl-escape.hs:2:10: warning: backslash and newline separated by space infix 5 \-- more stuff While i don't agree at all with this idea of fudging `backslash, spaces, newline', into a line continuation escape, since it breaks the law of least supprise. ie `backslash, newline' is the way it is done everywehere else i have *ever* seen AND the way you stop that escape from happening is to insert whitespace between the backslash and newline. I do agree that the warning issued is useful - it allows people to spot the fact that they may have entered a space after a backslash when they did not intend it, however fudging it so that you are trying to work out what they meant to write is wrong. (As an aside, I do agree that white space is not the most sensbile thing to use to stop `escape' a line continuation escape. A single comment is good. However it does fly in the face of may years of doing the probably wrong thing -- especially when many other systems use the C preprocessor to preprocess random files.) The -traditional-cpp argument used to inhibit this works in 3.3.4 but not 3.4.3. Here is a patch that appears to correct the use of -traditional-cpp: --- gcc-3.4.3/gcc/cpplex.c 2004-02-18 22:10:13.000000000 +0000 +++ gcc-3.4.3-df/gcc/cpplex.c 2005-01-23 15:18:19.000000000 +0000 @@ -136,7 +136,8 @@ /* check for escaped newline */ p = d; - while (p != buffer->next_line && is_nvspace (p[-1])) + while (p != buffer->next_line + && !CPP_OPTION(pfile, traditional) && is_nvspace (p[-1])) p--; if (p == buffer->next_line || p[-1] != '\\') goto done; @@ -181,7 +182,8 @@ /* Escaped? */ p = d; - while (p != buffer->next_line && is_nvspace (p[-1])) + while (p != buffer->next_line + && !CPP_OPTION(pfile, traditional) && is_nvspace (p[-1])) p--; if (p == buffer->next_line || p[-1] != '\\') break; After building with the above: $ gcc-3.4.3-df -P -E -traditional-cpp -xc nl-escape.hs -- stuff infix 5 \\ -- more stuff $ gcc-3.4.3-df -P -E -xc nl-escape.hs -- stuff nl-escape.hs:2:10: warning: backslash and newline separated by space infix 5 \-- more stuff $ gcc-3.4.3-df -v Reading specs from /tool/gcc-3.4.3-df/i586-Linux/lib/gcc/i586-linux/3.4.3-df/specs Configured with: ../gcc-3.4.3-df/configure --host=i586-linux --target=i586-linux --prefix=/tool/gcc-3.4.3-df --exec-prefix=/tool/gcc-3.4.3-df/i586-Linux --program-suffix=-3.4.3-df --with-cpu=i586 --with-arch=i586 --with-tune=i586 --enable-__cxa_atexit --enable-languages=c,c++,f77 Thread model: posix gcc version 3.4.3-df ..david