2017-01-27 2 views
0

В моем коде я использовал макрос препроцессорпрепроцессора макроса вызывающих встроенная функция

#define BAR(x) x+2 

, но потом я понял, что мне нужна функция встроенной в этом месте и в конечном итоге с помощью следующего кода

#define BAR(x) in_bar(x) 

inline double in_bar(double x) { 
    return x + 2; 
} 

void main() { 
    std::cout << BAR(2) << std::endl; 
} 

Is это действительно? Кажется, что это работает, но не вызовет ли это потенциальных проблем?

+2

Почему сохраняя MACRO? – Jarod42

+0

@ Jarod42, потому что в противном случае мне нужно будет отредактировать несколько файлов в нескольких местах, и просто не стоит тратить время на это ... – Tim

+3

Как насчет 'inline double BAR (double d) {return x + 2;}'? – Jarod42

ответ

3

Это действительно, но не нужно. Вместо этого вызовите встроенную функцию непосредственно из main. Кроме того, main должен возвращать int

inline double in_bar(double x) { 
    return x + 2; 
} 

int main() { 
    std::cout << in_bar(2) << std::endl; 
} 
+0

Ответ правильный, если вы только прокомментировали, почему подход в вопросе действителен, я был бы рад принять ваш ответ. Наконец, я закончил использование встроенных функций и редактирование кода, как было предложено вами и в комментариях. – Tim

+0

@ Люди, которые уже предложили, что подход действителен, потому что нет логической/синтаксической ошибки и компилируется в один и тот же код сборки. Макрос 'BAR' является избыточным. – Shreevardhan

+0

Я * знаю *, это избыточно, мой вопрос просто в том, что компилятор правильно справится с встроенными функциями в описанном сценарии (поскольку макросы и встроенные функции просят компилятор делать то же самое). – Tim

1

Ваш оригинальный макрос был сломан, и с помощью функции будет исправить.

E.g. если кто-то написал bar(1<<2)*4, он сгенерировал бы 1 < < 2 + 2 * 4, что не так, как вы ожидаете.

Если какой-то из ваших кодов полагался на нарушенное поведение, результат будет отличаться (но в большинстве случаев функциональный вариант будет лучше). Как и другие предложили - просто сделайте BAR встроенной функцией без макроса.

КСТАТИ: Надлежащим макрос будет

#define BAR(x) ((x)+2) 
+3

В качестве альтернативы исходный макрос был правильным, и использование функции вызовет нежелательное изменение в поведении ... –

+0

Для меня это клиентский код, основанный на сломанном коде - и я добавил, что в ответе эффект тот же, то есть клиент будет разорван после изменения. Но без какой-либо документации, описывающей это поведение для макроса, я говорю, что макрос нарушен. –

Смежные вопросы