c++ windows visual-c++ bison

c++ - Problema al llamar a std:: max



windows visual-c++ (2)

Defina el símbolo NOMINMAX en la parte superior de su fuente, antes de incluir cualquier encabezado. Visual C ++ define min y max como macros en algún lugar de windows.h , e interfieren con el uso de las funciones estándar correspondientes.

#define NOMINMAX

Recopilé mis archivos generados por bisontes en Visual Studio y obtuve estos errores:

... / position.hh (83): error C2589: ''('': token ilegal en el lado derecho de ''::''
... / position.hh (83): error C2059: error de sintaxis: ''::''
... / position.hh (83): error C2589: ''('': token ilegal en el lado derecho de ''::''
... / position.hh (83): error C2059: error de sintaxis: ''::''

El código correspondiente es:

inline void columns (int count = 1) { column = std::max (1u, column + count); }

Creo que el problema es con std :: max; si cambio std :: max a un código equivalente, ya no hay ningún problema, pero ¿hay una solución mejor en lugar de cambiar el código generado?

Aquí está el archivo bisonte que escribí:

// // bison.yy // %skeleton "lalr1.cc" %require "2.4.2" %defines %define parser_class_name "cmd_parser" %locations %debug %error-verbose %code requires { class ParserDriver; } %parse-param { ParserDriver& driver } %lex-param { ParserDriver& driver } %union { struct ast *a; double d; struct symbol *s; struct symlist *sl; int fn; } %code { #include "helper_func.h" #include "ParserDriver.h" std::string error_msg = ""; } %token <d> NUMBER %token <s> NAME %token <fn> FUNC %token EOL %token IF THEN ELSE WHILE DO LET %token SYM_TABLE_OVERFLOW %token UNKNOWN_CHARACTER %nonassoc <fn> CMP %right ''='' %left ''+'' ''-'' %left ''*'' ''/'' %nonassoc ''|'' UMINUS %type <a> exp stmt list explist %type <sl> symlist %{ extern int yylex(yy::cmd_parser::semantic_type *yylval, yy::cmd_parser::location_type* yylloc); %} %start calclist %% ... grammar rules ...


Probablemente esté incluyendo windows.h algún lugar, que define macros llamadas max y min .

Puede #define NOMINMAX antes de incluir windows.h para evitar que defina esas macros, o puede evitar la invocación de macro utilizando un conjunto adicional de paréntesis:

column = (std::max)(1u, column + count);