2012-06-08 2 views
0

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

/* c is where the result is stored */ 
#define EXP(a,b,c) c=a; for (int ii=0; ii<(b)-1; c*=(a), ii++); 

Это работает, но я не могу использовать EXP (а, б, в) в выражении, как function(EXP(a,b,c)); я должен был бы сделать

int result; 
EXP(a,b,result); 
function(result); 

В этом, я думаю, что будет работать в выражениях, но он не компилировать

#define EXP(a,b) int c=a; for (int ii=0; ii<(b)-1; (c)*=(a), i++); c 

с: error: expected primary-expression before ‘int’ при использовании:

int result = EXP(2,10); 

это мой репрезентативная функция:

int EXP(int base, int power) { 
    int result = base; 
    for (int ii=0; ii<power-1; ii++) 
    result *= base; 
    return result; 
} 
+1

Это существо C++, есть конкретная причина для Вас, чтобы стремиться к макро вместо встроенная функция? –

+0

Это C++, вы рассмотрели метапрограммирование шаблона? – juanchopanza

+0

Обычно я просто ввел функцию. На соревновании есть только один компьютер в каждой команде по 3, каждый член по очереди. Сначала мне нужно будет выписать свою программу на бумаге, а затем ввести в компьютер как можно быстрее. Практически, однако, я, вероятно, не буду экономить много времени с макросом, я думаю. – xst

ответ

3

Использование макрофункции неправильный инструмент для работы. Тем не менее, вы говорите вы думаете, что это будет работать внутри выражения, подумайте, как бы это выглядело для фактического компилятора раз препроцессор сделал свою работу:

int result = int c=2; for (int ii=0; ii<(10)-1; (c)*=(2), i++); c 
не

Независимо от того, насколько сильно вы попробуете, вы не можете сделать переменную определений или for в выражении.

+0

Я видел [эти] (http://www3.ntu.edu.sg/home/ehchua/programming/icpc/icpc_programming_tips.html) и думал, что это возможно. Это третий заголовок сверху: «(C/C++)« Страшный #define »(извините, что не было привязанных тегов) – xst

+1

@xst: Нет, они также не могут использоваться в выражениях. Кстати, зачем вам макрос _dreader_ вместо обычной? –

3

Вы можете использовать рекурсивный шаблон шаблон подход:

template<int base, unsigned int exp> 
struct Pow { 
    enum { value = base * power<base, exp-1>::value }; 
}; 
// stopping condition 
template<int base> 
struct Pow<base,0> { 
    enum { value = 1 }; 
}; 

и использовать его как это:

int i = Pow<10,2>::value; 
Смежные вопросы