Конкатенация макросов g ++ против конкатенации макросов c ++ - PullRequest
0 голосов
/ 22 января 2020

Я портирую проект c ++ на windows в windows, и я столкнулся со следующей ошибкой.

UeiDaqAnsiC.cpp:105:24
error: expected ')' before string constant
UEI_ERROR(__FUNCTION__ " error: %s\n", e.getErrorMessage());

Похоже, что linux не может объединить макрос __FUNCTION__ со следующей строкой. Это сбивает с толку, так как проект компилируется и собирается просто отлично в Windows.

В качестве быстрого исправления, кажется, просто добавление , между __FUNCTION__ и "error: %s\n", e.getErrorMessage() полностью исправляет его.

Новая фиксированная линия выглядит следующим образом UEI_ERROR(__FUNCTION__, " error: %s\n", e.getErrorMessage());

Я пришел сюда, потому что я не очень хорошо разбираюсь в компиляторе linux g ++, и я хочу знать, является ли это допустимым обходным путем для этой ошибки, прежде чем я исправлю все 130 строк, где эта ошибка возникает.

РЕДАКТИРОВАТЬ: Я также хочу спросить, сохраняет ли запятая функциональность простого объединения макроса и строки

EDIT2: UEI_ERROR определяется как #define UEI_ERROR(...) UeiPalTraceOutputWithLevel(UeiPalTraceError, __VA_ARGS__)

1 Ответ

1 голос
/ 22 января 2020

__FUNCTION__ не является строковым литералом и не может быть объединен препроцессором с другим строковым литералом.

Ваше "исправление" путем добавления , меняет значение, в основном как

printf(__FUNCTION__ " format %i", 42);        // MyFunction format 42
printf("MyFunction", "unused format %i", 42); // MyFunction

Реальным решением было бы изменить формат и изменить порядок параметров:

UEI_ERROR("%s error: %s\n", __FUNCTION__, e.getErrorMessage());// MyFunction error: error message.
...