LINUX.ORG.RU

Сборка под MinGW


0

0

Объясните загадку. Почему у меня в Линуксе gcc такой код (элементарный) 
собирает, а MinGW под виндой не хочет?! Gcc же тот же?!

1: // 
2: #define min(a, b)  (((a) < (b)) ? (a) : (b))

...

159: double function(...)
160: {
...
234:    return (min(u, u_) >= Unp ? true : false);
235: }

-------------------------------------------
234: error: 'min' was not declared in this scope
★★★★★
Ответ на: комментарий от yyk

Да немного неверно написал, ну вот например:

#define min(a, b)  (((a) < (b)) ? (a) : (b))

double function()
{
   double u = 3.0, u_ = 5.0;
   return (min(u, u_));
}

GladAlex ★★★★★
() автор топика
Ответ на: комментарий от GladAlex

Задал вопрос, получил ответ ;)
А теперь так соберите и увидите:

#define min(a, b)  (((a) < (b)) ? (a) : (b))
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdarg.h>

double function()
{
   double u = 3.0, u_ = 5.0;
   return (min(u, u_));
}

Если #define поместить после всех #include, то собирается, а иначе - error.
А в Линуксе было по барабану ;)

GladAlex ★★★★★
() автор топика
Ответ на: комментарий от GladAlex

и вообще макросы заглавными буквами называть принято

anonymous
()
Ответ на: комментарий от GladAlex

А!

#include <iostream> - писал?
а он по цепочке включает c++\3.4.2\bits\stl_algobase.h,
в котором зелёным по тёмно-синему написано - 

  #undef min
  #undef max

  /**
   *  @brief This does what you think it does.
   *  @param  a  A thing of arbitrary type.
   *  @param  b  Another thing of arbitrary type.
   *  @return   The lesser of the parameters.
   *
   *  This is the simple classic generic implementation.  It will work on
   *  temporary expressions, since they are only evaluated once, unlike a
   *  preprocessor macro.
  */
  template<typename _Tp>
    inline const _Tp&
    min(const _Tp& __a, const _Tp& __b)
    {
      // concept requirements
      __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
      //return __b < __a ? __b : __a;
      if (__b < __a)
    return __b;
      return __a;
    }

anonymous
()
Ответ на: комментарий от GladAlex

Вероятно, в linux другой gcc и другая редакция header-ов. Выпусти код после прохода препроцессора, ассемблерный код, сравни для разного положения макроса. возможно, где-то using namespace std затесался... :)

anonymous
()
Ответ на: комментарий от Sectoid

> Вот это как раз демонстрация, почему нельзя использовать препроцессор.

Гонишь. это как стоять у дверей травмпункта и приговаривать - "Вот это как раз демонстрация, почему нельзя пользоваться ножом. А вот это как раз демонстрация, почему нельзя пользоваться стремянкой. А вот это как раз демонстрация, почему нельзя пользоваться молотком..."

Хотелось-бы услышать начальника транспортного цеха... бр... GladAlex'а почему оно таки компилировалось под linux'ом :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.