ehaerim Ответов: 1

__VA_ARGS__ работает для getlasterror() безопасно?


Макрос LogTxt определяется следующим образом:

#define LogTxt(...) \
	BOOL bRet1 = SetEvent(hEvt);     \
	ATLTRACE(__VA_ARGS__)


В середине исходного кода LogTxt использует GetLastError в качестве аргумента.
...
HANDLE hEvt;
HWND hWnd;
BOOL bRet2 = ShowWindow(hWnd, 1);
LogTxt("GetLastError=%d", GetLastError());
...

Я ожидаю, что LogTxt напечатает номер ошибки для ShowWindow, но результатом будет номер ошибки для SetEvent.
__VA_ARGS_ макрос не является безопасным для использования с getlasterror в качестве аргумента.

Что я уже пробовал:

Я пытался

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
{
	HANDLE hEvt;
	HWND hWnd;
	BOOL bRet2 = ShowWindow(hWnd, 1);
	LogTxt("GetLastError=%d", GetLastError());
	return 0;
}


и ожидаемый результат был 1400, но фактический результат был 6

GetLastError=6

=> Таким образом, __VA_ARGS__ небезопасно использовать GetLastError в качестве аргумента.

Mohibur Rashid

GetLastError возвращает int, я не вижу никакой проблемы, в этом контексте не выглядит никакой проблемы.

1 Ответов

Рейтинг:
2

CPallini

Обратите внимание, что в опубликованном коде определенный макрос является LogTxt в то время как макросы используют вызовы LogFTxt.

В любом случае, ваша проблема заключается не в вариативном макросе. Это, вместо того, чтобы SetEvent вызов функции в макросе, выданные до то GetLastError один. То есть GetLastError отчеты о работе SetEvent исполнение.


Maciej Los

5ed!

CPallini

Спасибо!