0

I have this function I am trying to define in my header in which i also have defined a class, but for some reason it this not possible, as I don't see why it is causing so many problems.

database.h

//#pragma once #ifndef DATABASE_H #define DATABASE_H #include "record.h" #include "spectogram.h" #include <iostream> #include <experimental/filesystem> #define string_dir_to_test_files "/home/noob/soundcloud/src/include/database/test_files/" class database { public: vector<AudioFile<SAMPLE>> list_of_files; database(); }; int number_of_files(std::experimental::filesystem::path path); #endif DATABASE_H 

database.cpp

#include "database.h" int number_of_files(std::experimental::filesystem::path path) { using std::experimental::filesystem::directory_iterator; return std::distance(directory_iterator(path),directory_iterator(path)); } database::database() { std::experimental::filesystem::path _path(string_dir_to_test_files); if (std::experimental::filesystem::exists(_path)) { std::cout << "exists() = " << std::experimental::filesystem::exists(_path) << "\n" << "root_name() = " << _path.root_name() << "\n" << "root_path() = " << _path.root_path() << "\n" << "relative_path() = " << _path.relative_path() << "\n" << "parent_path() = " << _path.parent_path() << "\n" << "filename() = " << _path.filename() << "\n" << "stem() = " << _path.stem() << "\n" << "extension() = " << _path.extension() << "\n"; std::cout << "Number of files in directory: " << number_of_files(_path) << std::endl; } } 

spectogram.h

#pragma once #include <sigpack.h> #include "AudioFile.h" #include <iostream> typedef float SAMPLE; class spectogram { public: spectogram(); arma::mat generate_spectogram(const AudioFile<SAMPLE> *file) { arma::mat output; if(file->getNumChannels() == 2) { std::cout << "I am here" << std::endl; arma::Col<SAMPLE> ch1 = file->samples[0]; arma::Col<SAMPLE> ch2 = file->samples[1]; arma::mat output = sp::specgram(ch1); return output; } else { std::cout << "I am am here" << std::endl; arma::Col<SAMPLE> ch1 = file->samples[0]; arma::mat output = sp::specgram(ch1); std::cout << output << std::endl; return output; } } }; 

record.h the audiofile include is this one

#pragma once #include <iostream> // Functionality: COUT #include "portaudio.h" #include <stdio.h> #include <stdlib.h> #include <chrono> //Functionality: Sleep #include <thread> //Functionality: Sleep #include <algorithm> //Functionality: fill_n #include "AudioFile.h" #define SAMPLE_RATE (44100) typedef float SAMPLE; #define NUM_SECONDS 10 #define NUM_CHANNELS 1 #define SAMPLE_SILENCE 0.0f #define PA_SAMPLE_TYPE paFloat32 #define FRAMES_PER_BUFFER (512) #define TRUE (1==1) #define FALSE (!TRUE) #define WRITE_TO_FILE TRUE typedef struct { int frameIndex; int maxFrameindex; SAMPLE *recordedSamples; } paTestData; class record { public: record(); void start_record(); AudioFile<SAMPLE> file; private: PaStreamParameters inputParameters, outputParameters; PaStream* stream; PaError err = paNoError; paTestData data; int totalFrames; int numSamples; int numBytes; SAMPLE max, val; double average; int recordCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData); static int recordCallbackSub(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData) { auto pThis = reinterpret_cast<record*>(userData); // get back the this pointer. return pThis->recordCallback( inputBuffer, outputBuffer,framesPerBuffer, timeInfo,statusFlags, nullptr); } }; 

match.h

#pragma once #include <iostream> class match { public: }; 

main.cpp

#include <record.h> #include <database.h> #include <match.h> #include <spectogram.h> #include <iostream> int main() { database start; //record somethis; //somethis.start_record(); //spectogram specto; //specto.generate_spectogram(&somethis.file); return 0; } 

gives me these warnings:

make [ 42%] Built target project_portaudio [ 57%] Built target record [ 68%] Built target spectogram [ 78%] Built target database Scanning dependencies of target match [ 84%] Building CXX object src/include/match/CMakeFiles/match.dir/match.cpp.o [ 89%] Linking CXX static library libmatch.a [ 89%] Built target match Scanning dependencies of target cmakeDemo [ 94%] Building CXX object src/CMakeFiles/cmakeDemo.dir/main.cpp.o In file included from /home/noob/soundcloud/src/main.cpp:2:0: /home/noob/soundcloud/src/include/database/database.h:25:8: warning: extra tokens at end of #endif directive [-Wendif-labels] #endif DATABASE_H ^~~~~~~~~~ [100%] Linking CXX executable ../cmakeDemo [100%] Built target cmakeDemo 

but the warnings remove if #include<match.h> is commented?

make [ 42%] Built target project_portaudio [ 57%] Built target record [ 68%] Built target spectogram [ 78%] Built target database [ 89%] Built target match [100%] Built target cmakeDemo 

Something is very weird?

3
  • You don’t show your real code. Commented Nov 16, 2017 at 19:11
  • @manni66 I added the full code, something seem to be very weird.. removing the #include<match.h> removes the warning => that file is empty so why even cause problems? Commented Nov 16, 2017 at 19:44
  • So suddenly the error is gone and only a warning is remaining... Commented Nov 16, 2017 at 23:17

2 Answers 2

1

The problem is you are lacking header guards. Each time you include the header it is considered as a redefinition of the function. You should add #pragma once at the start of your header to solve this problem

Sign up to request clarification or add additional context in comments.

5 Comments

Sorry... I do have header guards on my header file... forgot to add it in the code above. sorry. good suggestion though.
Maybe it is a matter of coping the file by the build system. Worth trying #ifndef just to test it doesn't relate to #pragma once limitations.
The code that’s shown doesn’t need include guards. But it also doesn’t produce the cited error. This answer is just a guess.
I added the full code, something seem to be very weird.. removing the #include<match.h> removes the warning => that file is empty so why even cause problems? @PeteBecker
I added the full code, something seem to be very weird.. removing the #include<match.h> removes the warning => that file is empty so why even cause problems? @OriBen-Shir
0

Based on your output, I see one warning here:

In file included from /home/noob/soundcloud/src/main.cpp:2:0: /home/noob/soundcloud/src/include/database/database.h:25:8: warning: extra tokens at end of #endif directive [-Wendif-labels] #endif DATABASE_H ^~~~~~~~~~ 

At the end of database.h, the #endif preprocessor has an extra DATABASE_H token at the end. #endif doesn't take any additional tokens, so remove it:

... #endif 

1 Comment

Yes... Not sure why added that... that fixed it... thanks :)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.