Перегрузка операторов макросами в с ++ - PullRequest
0 голосов
/ 22 марта 2020

Привет, у меня есть пример программы на макросах,

#include<iostream>
#define ABS(a) (a) < 0 ? -(a) : (a)

int main(){
    printf("%d",ABS(-1));
    std::cout<<ABS(-1);
    return 0;
}

В вышеприведенной программе я пытался заменить -1 с помощью in MACRO , но если я пытаюсь распечатать его с printf это работает !, но если я использую cout , это выдает ошибку. Я знаю, что это связано с перегрузкой оператора "<<" </strong>, но я не знаю точной причины. Пожалуйста, кто-нибудь может объяснить? Заранее спасибо.

Редактировать:

Severity    Code    Description Project File    Line    Suppression State
Error   C2678   binary '<': no operator found which takes a left-hand operand of type 'std::basic_ostream<char,std::char_traits<char>>' (or there is no acceptable conversion)  practice_project    C:\Users\source\repos\practice_project\Source.cpp   10  

Это ошибка, которая должна быть указана c? Так что мой вопрос не в том, почему я не должен использовать MACROS , мой вопрос в том, почему printf дал мне ответ, а почему не cout?

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Макросы выполняют поиск и заменяют перед компиляцией, поэтому printf("%d",ABS(-1)); становится printf("%d", (a) < 0 ? -(a) : (a)), а std::cout<<ABS(-1); становится std::cout<<(-1) < 0 ? -(-1) : (-1), и затем компиляция выполняется.

<< имеет более высокий приоритет, чем <, поэтому std::cout<<(-1) < 0 ? -(-1) : (-1) равен (std::cout<<(-1)) < 0 ? -(-1) : (-1).

В printf нет такого правила, которое можно применять как , в printf это разделитель аргументов, а не оператор.

1 голос
/ 22 марта 2020

Поймите, что макросы являются подстановкой чистого текста, поэтому cout становится:

std :: cout << (- 1) <0? - (- 1): (-1); </p>

...