ошибка компиляции: cpumask.h: «и» может не отображаться в списке параметров макроса - PullRequest
1 голос
/ 01 апреля 2009

Я пытаюсь переместить проект со старой платформы Linux на Kubunutu 9.04. Теперь я получаю эту ошибку при компиляции с gcc 4.3.3:

/usr/src/linux-headers-2.6.28-11-generic/include/linux/cpumask.h:600:37: error: "and" may not appear in macro parameter list

Если я правильно понял сообщение, ему нельзя использовать «и» в качестве макропараметра, поскольку это «зарезервированная команда». Два вопроса об этом:

  1. Как это возможно? Я не могу себе представить, что в заголовочных файлах Linux есть такая ошибка ... Я что-то не так делал раньше? Я попробовал #undef, но это не поможет.
  2. Как мне исправить эту ошибку? Это не может быть правдой, что я должен изменить заголовочные файлы linux, не так ли?

Спасибо за помощь.

Ответы [ 4 ]

1 голос
/ 04 апреля 2009

Я считаю, что проблема в том, что and - это ключевое слово в C ++, но не в C (они используют &&).

Парни из ядра иногда используют макросы как альтернативу встроенным функциям. Иногда, однако, им нужны макросы, потому что то, что они хотят сделать, должно быть сделано в области вызывающей функции, и определение функции, которая будет работать, не будет работать (например, макрос для определения имени текущей функции). ).

Предполагая, что рассматриваемые макросы действительно являются ложными встроенными функциями, можно написать собственный файл .c, полный только функций, вызывающих эти макросы, скомпилировать его и ссылаться на эти функции через заголовок extern "C". Вы бы получили такое же поведение, но чуть хуже производительность (что вряд ли будет проблемой).

Если макросы действительно должны быть макросами, то лучше всего отредактировать их вручную, чтобы они были совместимы с C ++.

1 голос
/ 01 апреля 2009

Заголовки Linux - это заголовки C, а не C ++.

0 голосов
/ 06 мая 2016

определение for_each_cpu_and (процессор, маска и) на #define for_each_cpu_and (процессор, маска и_деб)

Нашел это решение @ http://www.linux.org.ru/forum/development/4797542

0 голосов
/ 01 апреля 2009

Это помогло бы, если бы вы также показали строку, о которой идет речь. Возможно, все зависит от контекста, если вы сделаете что-то сумасшедшее, прежде чем включать заголовок, компилятор может запутаться и сгенерировать неочевидное сообщение об ошибке.

Существуют случаи, когда «и» действительно является зарезервированным словом, и если это C ++ - только разработчики ядра не будут заботиться слишком сильно, поскольку ядро ​​сосредоточено на C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...