2015-07-27 2 views
4

Например, я хотел бы сделать макрос отладки, который печатает строку кода, прежде чем пытаться ее выполнить. Я предполагаю, что это должно выглядеть примерно так, чтоМожно ли передать строку кода в C C++ - макрос?

#define TRACE(string) printf("Trying to execute: %s\n",\"string\"); \ 
         string 

... 

void foo() { 
    printf("1\n"); 
} 
void bar() { 
    printf("2\n"); 
} 

int main() { 
    ... 
    foo(); 
    TRACE(bar();); 
    ... 
} 

С ожидаемым выходом

... 
1 
Trying to execute: bar(); 
2 
... 

Ну, это не так, как один делает это: компилятор жалуется на незаконное синтаксисом. Есть ли способ сделать это вообще?

+0

C не поддерживает такие строки. Исследование Char Array и вы найдете решение – Joshpbarron

+0

В ответах ... Нужна '#', но, кроме того, последняя точка с запятой вызовет 'bar() ;;' – jabujavi

+0

, если ваш прецедент отлаживается. Я рекомендую попробовать GDB – DevZer0

ответ

11

Вы должны использовать stringification с помощью #:

#define TRACE(string) printf("Trying to execute: %s\n",#string); \ 
         string 

Полный пример:

#include <stdio.h> 

#define TRACE(string) printf("Trying to execute: %s\n",#string); \ 
          string 

void foo() { 
    printf("1\n"); 
} 
void bar() { 
    printf("2\n"); 
} 

int main() { 

    foo(); 
    TRACE(bar();); 
} 

выход:

1 
Trying to execute: bar(); 
2 

live example on ideone

8

Вы должны использовать оператор «стрингизации», #, что вызовет замещение "string".

#define TRACE(string) printf("Trying to execute: %s\n", #string); \ 
         string 
+0

Скрещен с @ m.s. –

2

В дополнение к предыдущим ответам, обернуть макрос вокруг do { /* ... */ } while(0) конструкции, как в:

#define TRACE(string) do { \ 
          printf("Trying to execute: %s\n", #string); \ 
          string \ 
         } while(0) 

В противном случае, это может привести к ошибкам, например,

if(condition) 
    TRACE(foo();) 

Если вы не обернуть его вокруг do { /* ... */ } while(0) конструкции, foo() будет называться даже если condition ложно. Если у вас есть следующий оператор else, это даже вызовет синтаксическую ошибку.

Для получения дополнительной информации см. Why use apparently meaningless do-while and if-else statements in macros?.