2015-09-02 3 views
-1

Я хочу использовать этот макрос, чтобы положить (если «я» больше нуля) символ «^» и число я прохожу (я) к макросмесь строки и числа в макро

#define ESP(i) ((i>0) ? ("^"(i)) : "") 

Я хочу назвать это таким образом

printf("%+d%s", n1, ESP(i)); 

где «я» является индексом цикла, но компиляция сообщает мне ошибка; Как я могу изменить код, чтобы быть прав?

+1

wt является ошибкой? – ANjaNA

ответ

-2

Вам не нужно (i) после «^». Измените свой макрос на это, и он должен работать #define ESP(i) ((i>0) ? ("^") : ("")). Затем в вашем заявлении printf, если вы хотите напечатать значение i после «^», тогда у вас есть что-то вроде этого printf("%s%d", ESP(i), i); Насколько я знаю, я не думаю, что вы можете отформатировать строку, чтобы включить целое число внутри макроса, поскольку это требуют вызова других функций, поэтому вам нужно привести i в строку внутри вашего printf.

+0

"* Вам не нужно (i) ... *" насколько я понимаю вопрос (значение) 'i' является явным обязательным. – alk

+1

Ну нет, он хочет, чтобы значение 'i' появлялось в расширении макроса. –

+0

Ooo, мой плохой от его объяснения Я думал, что он просто хотел напечатать «^», ok lemme удалить этот ответ, тогда – Yashwanth

1

Несколько грязный, но должно работать:

#include <stdio.h> 

#define DYNFORMAT(n, i) (i>0) ?"%+d%s%d\n" :"%+d%s%s\n", n, (i>0) ?"^" :"", (i>0) ?i :"" 

int main(void) 
{ 
    int i = 0; 
    printf(DYNFORMAT(42, i)); 
    i = 1; 
    printf(DYNFORMAT(42, i)); 
} 

Это должно напечатать:

+42 
+42^1 

Отказ от ответственности: Я не уверен, что это соответствует ли Стандарта и как избавиться от этого предупреждения (s), который он дает во время компиляции.


Чистый подход будет использовать два вызова printf().

Это может быть реализовано как макрос или функция.

Как я люблю препроцессор, макро версию здесь:

#define PRINT_ESP(n, i) \ 
do { \ 
    if (i = 0) \ 
    printf("%+d", n); \ 
    else \ 
    printf("%+d^%d", n, i); \ 
} while (0); 
+0

Обратите внимание, что '(i)' не эквивалентно '(i> 0)', если 'i' имеет подписанный тип. –

+0

Ашок, конечно. Но эта деталь. Однако это исправит. @JohnBollinger – alk

+0

Я предполагаю, что ваше предупреждение возникает из этого выражения: '(i> 0)? I:" "". Вы можете избежать предупреждения и изменить это выражение на простое 'i', если вы удаляете конечный дескриптор поля'% s' из второй строки формата. –

1

Макросов работать во время компиляции, а не во время выполнения. Они могут выполнять различные трюки с текстом, но они не оценивают что угодно. (Они могут, конечно, развернуть до код, который что-то оценивает.) Ввод форматированного значения переменной i в строку включает оценку i; макрос не может это сделать.

Вы могли бы вместо того, чтобы расширить сферу макро включить весь printf() вызов:

#define PRINT_ESP(n1, i) do { \ 
    printf(((i > 0) ? "%+d^%d" : "%+d"), n1, i); \ 
} while (0) 

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

Все эти варианты основаны на том факте, что аргументы, превышающие требуемые данным форматом, оцениваются до вызова, но игнорируются самим printf().

+0

Это не сработает, по крайней мере потому, что '% s' ожидает строку, которая не находится в списке аргументов. – alk

+0

@alk, хорошо поймать. исправлено. –

+0

Гораздо более прямолинейный, затем мой ответ. Также более чистый, поскольку он генерирует несколько предупреждений. – alk