Как использовать Cout в макросе C ++ - PullRequest
0 голосов
/ 10 марта 2012

У меня есть следующий макрос для измерения времени в заголовочном файле:

#define TIMER_START(x) double ___timer__##x = (double) getTickCount(); 
#define TIMER_END(x) ___timer__##x = (getTickCount() - ___timer__##x) *1000 /  getTickFrequency(); cout << "t" << ##x << ": " << ___timer__##x << endl;

Проблема в том, что когда я использую этот заголовочный файл, cout не определяется. Есть ли возможность использовать его таким образом? Я попытался указать пространство имен, но безуспешно. В ostream :: и std :: нет определения для cout.

PS: я работаю в MSVS2010.

1 Ответ

3 голосов
/ 10 марта 2012

Имя cout должно быть видно в том месте, где вы вызываете макрос. Запись

TIMER_START(0);

все равно что писать

double ___timer__0 = (double) getTickCount();;

и применяются те же правила видимости.

Я подозреваю, что изменение cout на std::cout решит проблему. Конечно, вам нужно включить соответствующий заголовок в любой исходный файл, который вызывает макрос.

Некоторые другие проблемы:

Идентификаторы, начинающиеся с подчеркивания, зарезервированы для реализации. Я считаю, что C ++ также резервирует идентификаторы со встроенными двойными подчеркиваниями. Вы пытаетесь избежать столкновения с определенными пользователем идентификаторами, но вы рискуете столкнуться с определенными компилятором или определенными библиотекой идентификаторами. Вероятно, это не вызовет каких-либо видимых проблем, но вам следует использовать другой уникальный префикс.

Конечные точки с запятой в ваших определениях макросов являются избыточными; вы предоставите их при вызове:

TIMER_START(0);
TIMER_END(0);
...