尝试构建FVWM95的预处理器错误

时间:2015-02-06 19:05:22

标签: gcc c-preprocessor

尝试构建fvwm95-2.0.43f我收到以下错误:

FvwmIconBox.c: In function 'myErrorHandler':
FvwmIconMan.c:412:1: error: pasting "." and "res" does not give a valid preprocessing token
操作系统是Debian,试过Wheezy和Jessie。我最好的猜测是,这可能只是对自从FVWM95问世以来gcc如何处理预处理器语法的一个小改动,但不确定。

抓住这里的来源: http://sourceforge.net/projects/fvwm95/files/fvwm95/

谢谢!

1 个答案:

答案 0 :(得分:1)

嗯,粘贴实际的行和预处理器宏可能是有用的,因为我们都喜欢下载在过去的12。5年中没有看到变化的tgz&#;

#define SET_MANAGER(manager,field,value)                           \
   do {                                                            \
     int id = manager;                                             \
     if (id == -1) {                                               \
       for (id = 0; id < globals.num_managers; id++) {             \
     globals.managers[id].##field = value;                     \
       }                                                           \
     }                                                             \
     else if (id < globals.num_managers) {                         \
       globals.managers[id].##field = value;                       \
     }                                                             \
     else {                                                        \
       ConsoleMessage ("Internal error in SET_MANAGER: %d\n", id); \
     }                                                             \
   } while (0)

升。 412:

SET_MANAGER (manager, res, r);

你是对的:它是一个小小的变化&#34;在十年的最后一个十年中突然发生的事情;):

来自https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html

  

然而,两个不在一起形成有效令牌的令牌是不可能的   贴在一起。例如,您无法将x与+ in连接   无论是订单。如果您尝试,预处理器会发出警告并发出警告   两个代币。是否在令牌之间放置空格是   未定义。在复杂中找到'##'的不必要用法是很常见的   宏。如果你收到这个警告,你可能很简单   删除'##'。