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.
  • L Lost User

    Where is the definition of CLASS_I2CIO and its constructors?

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

    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 S 2 Replies 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

      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