Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. error: expected identifier before string constant

error: expected identifier before string constant

Scheduled Pinned Locked Moved C / C++ / MFC
helpc++tools
13 Posts 5 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V Vaclav_

    I hope I can explain this problem. I can make an instance of a class in my main()

    CLASS\_I2CIO   i2c\_ads1115(DEVICE\_I2C,ADDRESS\_ADS);
    

    no problema. But if I add same code as class variable - I need an access to the class form main() - I get the following error.

    class C_VNA {
    public:
    C_VNA();
    virtual ~C_VNA();

    C\_Utility utility;
    CLASS\_LCM1602 i2c;	// default constructor x,x,x,x);
    CIOCTLGPIO gpio;    // GPIo
    C\_IOCTL\_SPI spi;    // temporary not coded
    C\_DDS\_60 dds;       // frequency
    C\_AD8302\_Detector det;
    C\_ADS1115 ads;
    CLASS\_I2CIO   i2c\_ioctl;       // genric i2c using ioctl
    

    error here
    CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
    error here
    };

    Partial compiler output

    Compiler executable checksum: 606522cdd68a1ba2fd9e2930e9d38d0d
    In file included from ../src/MODULES/M_VNA/CVNA.cpp:8:0:
    ../src/MODULES/M_VNA/CVNA.h:28:20: error: expected identifier before string constant
    #define DEVICE_I2C "dev/i2c-1"
    ^
    ../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
    src/MODULES/M_VNA/subdir.mk:18: recipe for target 'src/MODULES/M_VNA/CVNA.o' failed
    CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
    ^
    ../src/MODULES/M_VNA/CVNA.h:28:20: error: expected ‘,’ or ‘...’ before string constant
    #define DEVICE_I2C "dev/i2c-1"
    ^
    ../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
    CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
    ^
    make: *** [src/MODULES/M_VNA/CVNA.o] Error 1

    There is nothing special about #defines

    // devices
    #define DEVICE_SPI "dev/spidev0.0"
    #define DEVICE_I2C "dev/i2c-1"

    // define i2c addresses
    #define ADDRESS_HITACHI 0x27
    #define ADDRESS_ADS 0x48

    The error "points " to #define which is redefined in this class - temporary for test purposes. I did look thru similar problems and they all indicate the #define is NOT the issue, however I am unable to figure this out and correct it. Any help would be appreciated. Cheers

    K Offline
    K Offline
    k5054
    wrote on last edited by
    #4

    Vaclav_ wrote:

    The error "points " to #define which is redefined in this class - temporary for test purposes.

    Are you doing something like this?

    #include "spi.h" // #defines DEVICE_SPI, etc

    #define DEVICE_SPI_"dev/spidev0.0" // Temporary define

    class C_VNA {
    // ...
    };

    That would mean that you're re-defining DEVICE_SPI, but normally your compiler should warn about redifines. Maybe you need #undef where you set up your temp defines. e.g.

    #ifdef DEVICE_SPI
    #define ORIG_DEVICE_SPI DEVICE_SPI
    #undef DEVICE_SPI
    #endif
    #define DEVICE_SPI "dev/spidev0.0"
    // your code here that uses the temporary DEVICE_SPI

    #ifdef ORIG_DEVICE_SPI
    #undef DEVICE_SPI
    #define DEVICE_SPI ORIG_DEVICE_SPI
    #undef ORIG_DEVICE_SPI
    #endif

    1 Reply Last reply
    0
    • V Vaclav_

      Here is the part in question

      class CLASS_I2CIO {
      public:
      CLASS_I2CIO();
      CLASS_I2CIO(char Device, int Address);
      CLASS_I2CIO(int width, int length, int height)
      : m_width(width), m_length(length), m_height(height)
      {}

      CLASS\_I2CIO(char \*x1, int y1); // :
      

      this is the one which fails
      CLASS_I2CIO(char *x1, int y1, int Width, int Height);

      private:
      char *device;
      int address;
      int width, height;

      public:
      virtual ~CLASS_I2CIO();
      int FileDescriptor = 0;

      // class variables
      \_\_u8 reg;  /\* Device register to access \*/
      \_\_s32 res;
      char buffer\[10\]= { }; // clear buffer  - was not initialized
      
      L Offline
      L Offline
      Lost User
      wrote on last edited by
      #5

      That is incomplete, and will not even compile, so it is impossible to guess what else may be wrong. [edit] See Graham's answer below. [/edit]

      1 Reply Last reply
      0
      • V Vaclav_

        I hope I can explain this problem. I can make an instance of a class in my main()

        CLASS\_I2CIO   i2c\_ads1115(DEVICE\_I2C,ADDRESS\_ADS);
        

        no problema. But if I add same code as class variable - I need an access to the class form main() - I get the following error.

        class C_VNA {
        public:
        C_VNA();
        virtual ~C_VNA();

        C\_Utility utility;
        CLASS\_LCM1602 i2c;	// default constructor x,x,x,x);
        CIOCTLGPIO gpio;    // GPIo
        C\_IOCTL\_SPI spi;    // temporary not coded
        C\_DDS\_60 dds;       // frequency
        C\_AD8302\_Detector det;
        C\_ADS1115 ads;
        CLASS\_I2CIO   i2c\_ioctl;       // genric i2c using ioctl
        

        error here
        CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
        error here
        };

        Partial compiler output

        Compiler executable checksum: 606522cdd68a1ba2fd9e2930e9d38d0d
        In file included from ../src/MODULES/M_VNA/CVNA.cpp:8:0:
        ../src/MODULES/M_VNA/CVNA.h:28:20: error: expected identifier before string constant
        #define DEVICE_I2C "dev/i2c-1"
        ^
        ../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
        src/MODULES/M_VNA/subdir.mk:18: recipe for target 'src/MODULES/M_VNA/CVNA.o' failed
        CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
        ^
        ../src/MODULES/M_VNA/CVNA.h:28:20: error: expected ‘,’ or ‘...’ before string constant
        #define DEVICE_I2C "dev/i2c-1"
        ^
        ../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
        CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
        ^
        make: *** [src/MODULES/M_VNA/CVNA.o] Error 1

        There is nothing special about #defines

        // devices
        #define DEVICE_SPI "dev/spidev0.0"
        #define DEVICE_I2C "dev/i2c-1"

        // define i2c addresses
        #define ADDRESS_HITACHI 0x27
        #define ADDRESS_ADS 0x48

        The error "points " to #define which is redefined in this class - temporary for test purposes. I did look thru similar problems and they all indicate the #define is NOT the issue, however I am unable to figure this out and correct it. Any help would be appreciated. Cheers

        G Offline
        G Offline
        Graham Breach
        wrote on last edited by
        #6

        Inside a function, this declares a variable called i2c_ads1115 with type CLASS_I2CIO and calls the constructor with the two values DEVICE_I2C and ADDRESS_ADS:

        CLASS_I2CIO i2c_ads1115(DEVICE_I2C,ADDRESS_ADS);

        Inside a class definition it declares a member function called i2c_ads1115 that returns a CLASS_I2CIO type and takes two arguments, which is where the compiler is having problems. Instead of DEVICE_I2C being a type, you have a #defined string. To get i2c_ads1115 as a member variable, declare it the same way as the i2c_ioctl member variable, then construct it with arguments in the initialization list of the C_VNA class.

        V 1 Reply Last reply
        0
        • G Graham Breach

          Inside a function, this declares a variable called i2c_ads1115 with type CLASS_I2CIO and calls the constructor with the two values DEVICE_I2C and ADDRESS_ADS:

          CLASS_I2CIO i2c_ads1115(DEVICE_I2C,ADDRESS_ADS);

          Inside a class definition it declares a member function called i2c_ads1115 that returns a CLASS_I2CIO type and takes two arguments, which is where the compiler is having problems. Instead of DEVICE_I2C being a type, you have a #defined string. To get i2c_ads1115 as a member variable, declare it the same way as the i2c_ioctl member variable, then construct it with arguments in the initialization list of the C_VNA class.

          V Offline
          V Offline
          Vaclav_
          wrote on last edited by
          #7

          Thanks, I'll give it a go. One more question. Why I have no issue with using same syntax making an instance of the class in main ()? Stupid question - could I just change the #define to "include" type ?

          G 1 Reply Last reply
          0
          • V Vaclav_

            Thanks, I'll give it a go. One more question. Why I have no issue with using same syntax making an instance of the class in main ()? Stupid question - could I just change the #define to "include" type ?

            G Offline
            G Offline
            Graham Breach
            wrote on last edited by
            #8

            I can't say why that syntax defines a variable using a constructor in one place and declares a member function in another - you would have to ask the people who designed C++ that. Making the #define include the type would probably give you a different error message, but it would still be attempting to declare a member function.

            1 Reply Last reply
            0
            • V Vaclav_

              I hope I can explain this problem. I can make an instance of a class in my main()

              CLASS\_I2CIO   i2c\_ads1115(DEVICE\_I2C,ADDRESS\_ADS);
              

              no problema. But if I add same code as class variable - I need an access to the class form main() - I get the following error.

              class C_VNA {
              public:
              C_VNA();
              virtual ~C_VNA();

              C\_Utility utility;
              CLASS\_LCM1602 i2c;	// default constructor x,x,x,x);
              CIOCTLGPIO gpio;    // GPIo
              C\_IOCTL\_SPI spi;    // temporary not coded
              C\_DDS\_60 dds;       // frequency
              C\_AD8302\_Detector det;
              C\_ADS1115 ads;
              CLASS\_I2CIO   i2c\_ioctl;       // genric i2c using ioctl
              

              error here
              CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
              error here
              };

              Partial compiler output

              Compiler executable checksum: 606522cdd68a1ba2fd9e2930e9d38d0d
              In file included from ../src/MODULES/M_VNA/CVNA.cpp:8:0:
              ../src/MODULES/M_VNA/CVNA.h:28:20: error: expected identifier before string constant
              #define DEVICE_I2C "dev/i2c-1"
              ^
              ../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
              src/MODULES/M_VNA/subdir.mk:18: recipe for target 'src/MODULES/M_VNA/CVNA.o' failed
              CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
              ^
              ../src/MODULES/M_VNA/CVNA.h:28:20: error: expected ‘,’ or ‘...’ before string constant
              #define DEVICE_I2C "dev/i2c-1"
              ^
              ../src/MODULES/M_VNA/CVNA.h:60:36: note: in expansion of macro ‘DEVICE_I2C’
              CLASS_I2CIO i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS);
              ^
              make: *** [src/MODULES/M_VNA/CVNA.o] Error 1

              There is nothing special about #defines

              // devices
              #define DEVICE_SPI "dev/spidev0.0"
              #define DEVICE_I2C "dev/i2c-1"

              // define i2c addresses
              #define ADDRESS_HITACHI 0x27
              #define ADDRESS_ADS 0x48

              The error "points " to #define which is redefined in this class - temporary for test purposes. I did look thru similar problems and they all indicate the #define is NOT the issue, however I am unable to figure this out and correct it. Any help would be appreciated. Cheers

              S Offline
              S Offline
              Stefan_Lang
              wrote on last edited by
              #9

              The compiler expects a function signature, but the function arguments you specified are missing a type. Try somthing like this

              CLASS_I2CIO i2c_ads1115_test(const char* DEVICE_I2C, int ADDRESS_ADS);

              (not sure what type the second argument is supposed to be)

              GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)

              V 1 Reply Last reply
              0
              • V Vaclav_

                Here is the part in question

                class CLASS_I2CIO {
                public:
                CLASS_I2CIO();
                CLASS_I2CIO(char Device, int Address);
                CLASS_I2CIO(int width, int length, int height)
                : m_width(width), m_length(length), m_height(height)
                {}

                CLASS\_I2CIO(char \*x1, int y1); // :
                

                this is the one which fails
                CLASS_I2CIO(char *x1, int y1, int Width, int Height);

                private:
                char *device;
                int address;
                int width, height;

                public:
                virtual ~CLASS_I2CIO();
                int FileDescriptor = 0;

                // class variables
                \_\_u8 reg;  /\* Device register to access \*/
                \_\_s32 res;
                char buffer\[10\]= { }; // clear buffer  - was not initialized
                
                S Offline
                S Offline
                Stefan_Lang
                wrote on last edited by
                #10

                CLASS_I2CIO(char Device, int Address);

                Surely you mean char* Device, not char Device? If the erroneous line is supposed to be an initialization of a variable calling this constructor, then that is not going to work: you can not initialize a member variable right inside the class declaration, unless it is static. Instead you have to do the initialization inside the constructor, like this:

                class C_VNA {
                C_VNA();
                ...
                CLASS_I2CIO i2c_ads1115_test; // just declaring the type of the member variable here
                };
                ...
                // constructors
                // initialize the class members here (only needed when not using default constructor)
                C_VNA::C_VNA()
                : i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS)
                {
                // more initialization code
                }

                [edit2]reintroduced tags [/edit]

                L 1 Reply Last reply
                0
                • S Stefan_Lang

                  CLASS_I2CIO(char Device, int Address);

                  Surely you mean char* Device, not char Device? If the erroneous line is supposed to be an initialization of a variable calling this constructor, then that is not going to work: you can not initialize a member variable right inside the class declaration, unless it is static. Instead you have to do the initialization inside the constructor, like this:

                  class C_VNA {
                  C_VNA();
                  ...
                  CLASS_I2CIO i2c_ads1115_test; // just declaring the type of the member variable here
                  };
                  ...
                  // constructors
                  // initialize the class members here (only needed when not using default constructor)
                  C_VNA::C_VNA()
                  : i2c_ads1115_test(DEVICE_I2C,ADDRESS_ADS)
                  {
                  // more initialization code
                  }

                  [edit2]reintroduced tags [/edit]

                  L Offline
                  L Offline
                  Lost User
                  wrote on last edited by
                  #11

                  Stefan_Lang wrote:

                  had to remove tags - for some reason they are not working!?

                  Look at the checkboxes below the edit window. Do you have "Treat my content as plain text, not as HTML" set?

                  S 1 Reply Last reply
                  0
                  • L Lost User

                    Stefan_Lang wrote:

                    had to remove tags - for some reason they are not working!?

                    Look at the checkboxes below the edit window. Do you have "Treat my content as plain text, not as HTML" set?

                    S Offline
                    S Offline
                    Stefan_Lang
                    wrote on last edited by
                    #12

                    Thanks, that was indeed the problem. No idea why it was checked - I almost always use tags. :confused: GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)

                    1 Reply Last reply
                    0
                    • S Stefan_Lang

                      The compiler expects a function signature, but the function arguments you specified are missing a type. Try somthing like this

                      CLASS_I2CIO i2c_ads1115_test(const char* DEVICE_I2C, int ADDRESS_ADS);

                      (not sure what type the second argument is supposed to be)

                      GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)

                      V Offline
                      V Offline
                      Vaclav_
                      wrote on last edited by
                      #13

                      Second argument function is an I2C device address = in this case A/D converter ADS1115.

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups