Missing binary operator before token как исправить

I recently got the following error when trying to compile with gcc:

error: missing binary operator before token «(«

Web and SO searches came up with several specific examples of this error, with specific code changes to fix them. But I found no general description of what condition causes this error to be issued.

When and why does gcc emit this error?

Brian Tompsett - 汤莱恩's user avatar

asked Jan 24, 2014 at 17:08

AShelly's user avatar

0

This is not a compiler error, it is a preprocessor error. It occurs when the preprocessor encounters invalid syntax while trying to evaluate an expression in a #if or #elif directive.

One common cause is the sizeof operator in an #if directive:

For example:

  #define NBITS (sizeof(TYPE)*8)
  //later
  #if (NBITS>16)    //ERROR

This is an error because sizeof is evaluated by the compiler, not the preprocesor.

Type casts are also not valid preprocessor syntax:

  #define ALLBITS ((unsigned int) -1)
  //later
  #if (ALLBITS>0xFFFF)    //ERROR

The rules for what can be in a valid expression are here.

Note also that #if will evaluate an undefined macro as 0, unless it looks like it takes arguments, in which case you also get this error:

So if THIS is undefined:

#if THIS == 0  //valid, true

#if THIS > 0 //valid, false

#if THIS() == 0  //invalid. ERROR

Typos in your #if statement can also cause this message.

answered Jan 24, 2014 at 17:08

AShelly's user avatar

AShellyAShelly

34.5k15 gold badges90 silver badges151 bronze badges

3

If you are on Linux, make sure that you do not have a header named features.h inside your project files.
I had one with this name, which resulted in:

/usr/include/x86_64-linux-gnu/bits/huge_val.h:25: error: function pointer expected

or

/usr/include/bits/huge_val.h:26:18: error: missing binary operator before token
«(«

That is because some system headers like huge_val.h use macros like __GNUC_PREREQ that are defined by /usr/include/features.h (learn more about this header in this SO question).

In my case I first saw this error when I started to use gcc’s -I option which suddenly made gcc select my project include directory before the default system include directories.

answered Nov 30, 2018 at 23:31

Gabriel Devillers's user avatar

1

You get this error sometimes if you have -fno-operator-names in your compiler flags. I suffered from the exact error while building json and this solved it.

answered Aug 15, 2019 at 21:03

Yusuf Gören's user avatar

check the direct. no space,no special
exp:
add_subdirectory(Main)->add_subdirectory(main)

answered Sep 8, 2020 at 9:03

asdgasg's user avatar

3

PackageManager: Installing tool-pyocd @ ~0.801.0
Downloading...
Unpacking...
tool-pyocd @ 0.801.0 has been successfully installed!
Processing LPC1768 (platform: https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.2.zip; framework: arduino; board: nxp_lpc1768)
--------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/nxplpc-arduino-lpc176x/nxp_lpc1768.html
PLATFORM: NXP Arduino LPC176x 0.1.1 > NXP LPC1768
HARDWARE: LPC1768 100MHz, 31.97KB RAM, 464KB Flash
DEBUG: Current (cmsis-dap) On-board (cmsis-dap) External (blackmagic, jlink)
PACKAGES: toolchain-gccarmnoneeabi 1.80201.190214 (8.2.1), framework-arduino-lpc176x 0.2.2
Converting Marlin.ino
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ off, Compatibility ~ strict
Found 6 compatible libraries
Scanning dependencies...
Dependency Graph
|-- <Servo> 1.0.0
|-- <LiquidCrystal> 1.0.0
|-- <U8glib-HAL> 0.4.1
|-- <TMCStepper> 0.5.2
|-- <Adafruit NeoPixel> 1.3.0
|-- <SailfishLCD>
Building in debug mode
 
Unable to find destination disk (Autodetect Error)
Please select it in platformio.ini using the upload_port keyword (https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) or copy the firmware (.pio/build/LPC1768/firmware.bin) manually to the appropriate disk
 
Compiling .piobuildLPC1768srcsrcHALHAL_LPC1768DebugMonitor.cpp.o
Compiling .piobuildLPC1768srcsrcHALHAL_LPC1768HAL.cpp.o
Compiling .piobuildLPC1768srcsrcHALHAL_LPC1768HAL_SPI.cpp.o
In file included from c:usersdandesktoptempmarlinsrcincMarlinConfigPre.h:54,
                 from c:usersdandesktoptempmarlinsrcincmarlinconfig.h:28,
                 from MarlinsrcHALHAL_LPC1768../../core/serial.h:24,
                 from MarlinsrcHALHAL_LPC1768DebugMonitor.cpp:26:
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
#define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^

c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2058:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(Z4)
       ^~~~~~~~~~~
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2108:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(E6)
       ^~~~~~~~~~~
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2115:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(E7)
       ^~~~~~~~~~~
Compiling .piobuildLPC1768srcsrcHALHAL_LPC1768MarlinSerial.cpp.o
Compiling .piobuildLPC1768srcsrcHALHAL_LPC1768fast_pwm.cpp.o
In file included from MarlinsrcHALHAL_LPC1768../../inc/MarlinConfigPre.h:54,
                 from MarlinsrcHALHAL_LPC1768../../inc/MarlinConfig.h:28,
                 from MarlinsrcHALHAL_LPC1768HAL.cpp:25:
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 

                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2058:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(Z4)
       ^~~~~~~~~~~
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2108:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(E6)
       ^~~~~~~~~~~
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2115:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(E7)
       ^~~~~~~~~~~
Compiling .piobuildLPC1768srcsrcHALHAL_LPC1768includedigipot_mcp4451_I2C_routines.c.o
Compiling .piobuildLPC1768srcsrcHALHAL_LPC1768main.cpp.o
In file included from MarlinsrcHALHAL_LPC1768../../inc/MarlinConfigPre.h:54,
                 from MarlinsrcHALHAL_LPC1768../../inc/MarlinConfig.h:28,
                 from MarlinsrcHALHAL_LPC1768HAL_SPI.cpp:51:
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~

c:usersdandesktoptempmarlinconfiguration_adv.h:2058:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(Z4)
       ^~~~~~~~~~~
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2108:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(E6)
       ^~~~~~~~~~~
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2115:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(E7)
       ^~~~~~~~~~~
In file included from MarlinsrcHALHAL_LPC1768../../inc/MarlinConfigPre.h:54,
                 from MarlinsrcHALHAL_LPC1768MarlinSerial.cpp:25:
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2058:7: note: in expansion of macro 'AXIS_IS_TMC'

   #if AXIS_IS_TMC(Z4)
       ^~~~~~~~~~~
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2108:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(E6)
       ^~~~~~~~~~~
c:usersdandesktoptempmarlinsrccoredrivers.h:68:51: error: missing binary operator before token "("
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
                                                   ^
c:usersdandesktoptempmarlinsrccoredrivers.h:91:31: note: in expansion of macro 'AXIS_DRIVER_TYPE'
 #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) 
                               ^~~~~~~~~~~~~~~~
c:usersdandesktoptempmarlinconfiguration_adv.h:2115:7: note: in expansion of macro 'AXIS_IS_TMC'
   #if AXIS_IS_TMC(E7)
       ^~~~~~~~~~~
*** [.piobuildLPC1768srcsrcHALHAL_LPC1768MarlinSerial.cpp.o] Error 1
*** [.piobuildLPC1768srcsrcHALHAL_LPC1768DebugMonitor.cpp.o] Error 1
*** [.piobuildLPC1768srcsrcHALHAL_LPC1768HAL.cpp.o] Error 1
*** [.piobuildLPC1768srcsrcHALHAL_LPC1768HAL_SPI.cpp.o] Error 1
*** [.piobuildLPC1768srcsrcHALHAL_LPC1768persistent_store_flash.cpp.o] Error 1
*** [.piobuildLPC1768srcsrcHALHAL_LPC1768main.cpp.o] Error 1
========================== [FAILED] Took 2.42 seconds ==========================
 
Environment                     Status    Duration
------------------------------  --------  ------------
megaatmega2560                  IGNORED
megaatmega1280                  IGNORED

at90usb1286_cdc                 IGNORED
at90usb1286_dfu                 IGNORED
DUE                             IGNORED
DUE_USB                         IGNORED
DUE_debug                       IGNORED
LPC1768                         FAILED    00:00:02.424
LPC1769                         IGNORED
sanguino_atmega644p             IGNORED
sanguino_atmega1284p            IGNORED
melzi                           IGNORED
melzi_optiboot                  IGNORED
rambo                           IGNORED
STM32F103RE                     IGNORED
STM32F103RC_fysetc              IGNORED
STM32F103RC_bigtree             IGNORED
STM32F103RC_bigtree_NOUSB       IGNORED
STM32F103RC_bigtree_512K        IGNORED
STM32F103RC_bigtree_512K_NOUSB  IGNORED
STM32F103RE_bigtree             IGNORED
STM32F103RE_bigtree_NOUSB       IGNORED
STM32F4                         IGNORED
STM32F7                         IGNORED
ARMED                           IGNORED
STM32F103VE_longer              IGNORED
mks_robin                       IGNORED
mks_robin_lite                  IGNORED
mks_robin_mini                  IGNORED
mks_robin_nano                  IGNORED
jgaurora_a5s_a1                 IGNORED
STM32F407VE_black               IGNORED
BIGTREE_SKR_PRO                 IGNORED
BIGTREE_BTT002                  IGNORED
teensy31                        IGNORED
STM32F103CB_malyan              IGNORED
chitu_f103                      IGNORED
teensy35                        IGNORED
esp32                           IGNORED
fysetc_f6_13                    IGNORED
linux_native                    IGNORED
SAMD51_grandcentral_m4          IGNORED
include_tree                    IGNORED
==================== 1 failed, 0 succeeded in 00:00:02.424 ====================

I am currently trying to install PySift inside a virtualenv on Mac. However, the Zstandard library results in an error when being installed.

In file included from /usr/include/Availability.h:236:0,
                     from /usr/include/stdlib.h:61,
                     from zstd/lib/compress/fse_compress.c:38:
    /usr/include/AvailabilityInternal.h:33:18: error: missing binary operator before token "("
     #if __has_include(<AvailabilityInternalPrivate.h>)
                      ^
    In file included from /usr/include/stdlib.h:61:0,
                     from zstd/lib/compress/fse_compress.c:38:
    /usr/include/Availability.h:497:18: error: missing binary operator before token "("
     #if __has_include(<AvailabilityProhibitedInternal.h>)
                      ^
    error: command 'gcc' failed with exit status 1

Most of the solutions I’ve seen on Stack Overflow usually suggest running xcode-select --install, but it did not work. Alternatively, this post suggests to use the following command

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

The command will open up a window that allows you to install the missing MacOS SDK. Yet, it still didn’t work. After that, I realized I have not updated Xcode to the latest version. But even after updating, the error still appears. Lastly, I tried to use brew, like in this post, and do some updating in case there was some corrupted software that prevented the installation to be completed.

I’ve also checked this post, and didn’t find my answer because I was specifically trying to find out why __has_include before ( resulted in an error.

In the end, it still did not work. I wonder if somebody can me point to what I was missing that caused the error?

Форум РадиоКот :: Просмотр темы — Проблема макросов в классах.


Автор:  Pink-Pank [ Чт дек 18, 2014 08:42:24 ]
Заголовок сообщения:  Проблема макросов в классах.

Всем добрый день!

Частенько использую макросы для автоматизированного расчета загружаемых в регистры значений. Например:

Код:

#define F_CPU 1200000UL
#define TIMER_FREQUENCY_HZ   1013   // Частота срабатывания таймера в герцах.
#define LOAD_VALUE   ((unsigned char)( round(((double)F_CPU / (double)TIMER_FREQUENCY_HZ / 8 — 1))))
….

OCR0 = LOAD_VALUE;   // 8 — предделитель таймера. Режим CTC

В общем, если использую подобные макросы при работе с регистрами напрямую или передавая значение функции, то все ОК.
А на этот раз решил поиграться с классами. Создал класс и появилась проблемка. При передаче функции класса числового значения все ОК. Либо если передаю макрос, где нет приведения типов, то тоже все ОК. А вот если в макросе есть приведение типа переменной, то компилятор начинает материться, что:
missing binary operator before token «(«
Кто может сталкивался с такой проблемой? Как ее решить? Я так предполагаю, что препроцессор сначала подставляет выражение из макроса, а уже потом его рассчитывает. Может можно как-то заставить его сначала рассчитать это значение, а потом уже подставлять куда надо? Или как-то альтернативно решить эту проблему?
Какой ентому гаду бинарный оператор нужен?

И еще. Если я функции класса передаю не переменные, а числовые константы, можно как-то компилятор заставить, чтобы функция не принимала значения через стек (или регистры), а генерировалась инлайном с подстановкой нужных значений, не качая их из стека? Это с учетом того, что она в классе и простой инлайн не катит, но вызывается при этом всего один раз.


Автор:  ploop [ Чт дек 18, 2014 09:34:27 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

У вас точка с запятой в макросе.

Pink-Pank писал(а):

Я так предполагаю, что препроцессор сначала подставляет выражение из макроса, а уже потом его рассчитывает

Именно так.

Pink-Pank писал(а):

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

Нет. Функция есть функция, это машинный код в итоге. Препроцессор не сможет запустить её на исполнение в результате компиляции и оставить только результат, так как неизвестно, что там внутри функции вы наворотили.
Ой, кажется не так вас понял
И, кстати, что за классы вы используете? У вас C++?

Цитата:

то с учетом того, что она в классе и простой инлайн не катит, но вызывается при этом всего один раз.

С чего это не может быть инлайновых методов? Вполне могут.


Автор:  Pink-Pank [ Чт дек 18, 2014 09:54:36 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

В макросе у меня нет точек с запятой. Это я просто здесь «намешал» код и макросы. Щас поправлю.
Да, я в студии 6 на си ++ изголяюсь. Хотя можно было бы все проще оформить — просто для опыта решил через класс.

Цитата:

С чего это не может быть инлайновых методов? Вполне могут.

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


Автор:  ploop [ Чт дек 18, 2014 10:10:36 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Думаю, вы что-то намутили…
Во-первых давайте не будем называть «функции класса», они называются методы, иначе рвёт мозг.

Pink-Pank писал(а):

Ведь если сделать два разных объявления классов с одинаковым набором внутренних переменных, потом создать эти два класса и попытаться присвоить значения одного класса другому, то компиль также выдаст ошибку. Думаю, здесь что-то подобное..

Как вы это делаете? Ничего не понял, покажите пример.


Автор:  Pink-Pank [ Чт дек 18, 2014 10:17:32 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Методы.. Шметоды.. Это все условности! ))) Главное — полет мысли! ))))))
Но если Вам так привычнее — пожалуйста! Мне не трудно. )

Код:

class First {
   int memi;
   double memd;
};

class Second {
   int memi;
   double memd;
};

class First obj1;
Second obj2 = obj1;   // ошибка: obj1 и obj2 имеют разные типы

Да и как я мог намутить, если передача обычного числа, макроса или переменной прокатывает, а макрос с преобразованием типов вызывает ошибку?
Т.е. если я передаю выражение, скажем F_CPU/16, то все ок. А если выражение (uint16_t)((double)F_CPU/16), то получается облом… Хотя при передаче в простую функцию второе выражение норм работает.


Автор:  ploop [ Чт дек 18, 2014 10:46:29 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Pink-Pank писал(а):

 // ошибка: obj1 и obj2 имеют разные типы

Естественно! Первый имеет тип First, второй — Second. А если они внутри одинаковы — так это ваша проблема, так как такой подход рвёт все шаблоны ООП.

Pink-Pank писал(а):

А если выражение (uint16_t)((double)F_CPU/16), то получается облом…

Ошибка то хоть какая?


Автор:  Pink-Pank [ Чт дек 18, 2014 10:52:31 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

я ж писал
missing binary operator before token «(«


Автор:  Siarzhuk [ Чт дек 18, 2014 11:28:52 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Pink-Pank писал(а):

А вот если в макросе есть приведение типа переменной, то компилятор начинает материться, что:
missing binary operator before token «(«
Кто может сталкивался с такой проблемой? Как ее решить? Я так предполагаю, что препроцессор сначала подставляет выражение из макроса, а уже потом его рассчитывает.

С какой проблемой? Где кот с классами? Телепатам гадать не на чем. ;-) На то он и называется ПРЕпроцессором, что он занимается ПРЕпроцессингом — т.е. работает с ко́дом ещё до компиляции.

При непонятных проблемах с макросами нужно включать опцию

-F Preprocess only

результат работы препроцессора будет сохранен в файле с расширением *.i а компиляция не будет производиться. При нормальной компиляции этот вот *.i и скармливается компилятору. Обычно достаточно одного взгляда на развёрнутый макрос чтобы понять в чём проблема.

Для inline попробуйте определить тело функции прямо v определении класса в h файле. А вообще нужно читать мануал на компилятор соответствующую тему — там наверняка оговариваются нюансы использования.

Pink-Pank писал(а):

Да и как я мог намутить,

Мутят все, мутили и будут мутить всегда и вовеки — чем вы лучше других? Как и во всяком ремесле опыт решает — другие просто эти шишки уже собрали на свои головы пока вы прохлаждались — вот и всё.

Pink-Pank писал(а):

// ошибка: obj1 и obj2 имеют разные типы

Определите операторы присваивания и будет вам счастье. Это нужно делать даже для одинаковых типов если они имеют ссылки на внешние ресурсы — по умолчанию компилятор создает оператор присваивания с простым копированием данных если оператор=(…) для этого типа не задан прокладкой между стулом и клавиатурой.


Автор:  Pink-Pank [ Чт дек 18, 2014 11:51:51 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Цитата:

Для inline попробуйте определить тело функции прямо v определении класса в h файле. А вообще нужно читать мануал на компилятор соответствующую тему — там наверняка оговариваются нюансы использования.

Уже пробовал.. Не помогает..

Цитата:

С какой проблемой? Где кот с классами?

Да что Вам мой кот, если компилятор глотает обычные числовые значения и макросы без преобразования типов.

Цитата:

Определите операторы присваивания и будет вам счастье.

поподробнее можно? Что-то я не очень понял, о чем Вы? Вы про перегрузку операторов?

Цитата:

-F Preprocess only

не -F, а -E
Сейчас попробую.
Что-то не генерится этот файл..
Выдает ошибку ld returned 1 exit status collect2.exe 0 0


Автор:  Siarzhuk [ Чт дек 18, 2014 12:13:54 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Pink-Pank писал(а):

Цитата:

С какой проблемой? Где кот с классами?

Да что Вам мой кот, если компилятор глотает обычные числовые значения и макросы без преобразования типов.

А без кота разговор беспредметен. Ну глотает, и чо? А вот нужные вам макросы не глотает. Не переваривает стало-быть их. Несъедобно готовите раз котейко давится. Скобок туда по уму добавьте — сожрёць как миленький — и не такое сжирал. И ещё раз про *.i выхлоп напоминаю — дюже важный доку́мент для пущего понимания процессов «прокладкой».


Автор:  Siarzhuk [ Чт дек 18, 2014 12:22:04 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Pink-Pank писал(а):

Вы про перегрузку операторов?

да, они, что-то типа

Код:

Second* Second::operator=(const First& first) {
  // тут присвоЯем поля
  return *this;
}

Pink-Pank писал(а):

Цитата:

-F Preprocess only

не -F, а -E
Сейчас попробую.
Что-то не генерится этот файл..
Выдает ошибку ld returned 1 exit status collect2.exe 0 0

Ну может и не -F и не *.i — вам на месте виднее — гляньте в папках где временные файлы/результаты компиляции — может какие *.pre или что-то в этом роде сохраняется — а сообщение означает что линкер не нашёл чего хотел — т.е. как-бы понятно почему — объектников-то ведь нету — один препроцессор. удачи.


Автор:  Pink-Pank [ Чт дек 18, 2014 12:25:57 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Цитата:

Несъедобно готовите раз котейко давится. Скобок туда по уму добавьте — сожрёць как миленький — и не такое сжирал.

Видно, скобочками и давится — потому что у меня их как раз валом! :)))

А как Вам тот факт, что тот же макрос обычной функцией принимается без проблем? ;)

Вот Вам мой класс *.h

Вот мой класс *.cpp

Вот моя функция с вызовом и подстановкой макроса:


Автор:  Siarzhuk [ Чт дек 18, 2014 12:36:37 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Pink-Pank писал(а):

Цитата:

Несъедобно готовите раз котейко давится. Скобок туда по уму добавьте — сожрёць как миленький — и не такое сжирал.

Видно, как раз скобочками и давится — потому что у меня их как раз валом! :)))

А как Вам тот факт, что тот же макрос обычной функцией принимается без проблем? ;)

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


Автор:  ploop [ Чт дек 18, 2014 14:02:46 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

У вас проблема точно в макросе? Раз ругается на битовую операцию, значит может быть в структуре Work_regim_Def, что после него идёт? Вы кажется намутили с областью видимости индентификатора UART


Автор:  Pink-Pank [ Чт дек 18, 2014 14:42:32 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

то, что идет после никакого отношения к ошибке не имеет. Я те параметры пробовал и вовсе комментировать, оставлял только один, который не робит. Не помогло. Перечисления я там сделал, чтобы вводимые значения в качестве параметров были фиксированными. Чтобы пользователь класса не мог запулить туда что-то не удобоваримое.

Да и при нажатии на ошибку выкидывает именно на макрос.

Попробую в IAR загнать.. если схавает — значит студия ка-ка. Если нет и с такой же ошибкой — значит ка-ка я! :)))


Автор:  Siarzhuk [ Чт дек 18, 2014 17:07:33 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Pink-Pank писал(а):

А функция round точно видна и не перекрывается переменной с таким именем?

Да и %s/BOAD/BAUD/g надо бы сделать. :-)


Автор:  Pink-Pank [ Пт дек 19, 2014 07:33:56 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Видна. У меня нет таких переменных.


Автор:  Аlex [ Пт дек 19, 2014 07:57:40 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

А если её (round) для пробы выкинуть из макроса, проглотит ?
ИМХО, для начала нужно методом исключения узнать, что конкретно «мешается» в макросе, а потом уже думать почему так происходит.


Автор:  Siarzhuk [ Пт дек 19, 2014 10:55:49 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Pink-Pank писал(а):

Видна. У меня нет таких переменных.

Т.е. если написать пару строками раньше что-то типа

double d = round(2342.346456);

компилятор скушает и не ругнётся?

ну разбивайте макрос по операциям на разных строчках с промежуточными результатами и смотрите на какой чертыхнётся если лень выхлоп препроцессора искать и времени не жалко.

В порядке постукивания по бубну оберните всю подстановку в скобки. Или воспользуйтесь конструкторо-подобной нотацией оператора приведения:

Код:

#define UBRR uint16_t( round( double(F_CPU) / 16.0 / BOAD_RATE ) — 1)


Автор:  BCluster [ Пт дек 19, 2014 12:37:19 ]
Заголовок сообщения:  Re: Проблема макросов в классах.

Проверил в IAR ARM такую конструкцию, она работает


Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/

Всем доброго времени суток!

Загорелся желанием сделать Dondolo и в процессе наткнулся на такой ‘камень’.

При залитии впрошивки Marlin Kimbra в Arduino + Ramps пишет, что, мол ‘ошибка компиляции’ (Если вам не трудно можете рассказать из-за чего она вообще случается и что это. Плюсик с моей стороны))

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

Скетч генерировал через конфигуратор на сайте Marlin Kimbra

Весь код ошибки выглядит так:

Arduino: 1.6.5 (Windows 8.1), Плата’Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)’

Изменена опция сборки, пересобираем все

In file included from MK4duo.ino:251:0:

base.h:41:24: fatal error: src/macros.h: No such file or directory

#include ‘src/macros.h’

^

compilation terminated.

Ошибка компиляции.

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

в карму.

Премногобагодарен всем кто откликнется!

Понравилась статья? Поделить с друзьями:
  • Как найти немую девушку
  • Дубай молл водопад с ныряльщиками как найти
  • Как составить историю персонажу
  • Как найти первую цифру ответа
  • Как найти свой режим дня