#define böse - auch hier?



  • Hallo,

    ich hätte mal eine Frage bezüglich defines... und zwar liest man ja immer wieder dass diese böse/schlecht/schlechter Stil etc. sind und bis jetzt hatte ich auch noch keinen Fall wo ich welche gebraucht hätte. Allerdings kann ich folgendes Problem sehr elegant mit einem define lösen, daher wollte ich mal fragen ob es in so einem Fall gut ist oder ob auch hier etwas dagegen spricht:

    // test.cpp
    namespace {
    	#define my_exception(message_) custom_exception(__FILE__, __LINE__, message_)
    
    	class test::custom_exception : public std::exception
    	{
    		public:
    			custom_exception(std::string const &file_name_, size_t line_number_, std::string const &message_) {
    				std::stringstream ss;
    				ss << file_name_ << " " << line_number_ << " " << message_;
    				message = ss.str();
    			}
    
    			virtual const char* what() const throw() {
    				return message.c_str();
    			}
    
    		private:
    			std::string message;
    	};
    }
    
    void test::foo()
    {
    	throw my_exception("my error message");
    }
    
    // main.cpp
    #include "test.h"
    int _tmain(int argc, _TCHAR* argv[])
    {
    	try {
    		test::foo();
    	}
    	catch (std::exception const &e) {
    		std::cerr << e.what();
    	}
    }
    

    Oder gibt es noch eine bessere Methode das zu erreichen (also Datei und Zeilennummer mit angeben) ohne defines zu verwenden?



  • #defines sollte man nicht verwenden, da Macros die Fehlersuche in vielen Fällen erschweren und in manchen fällen führt die Verwendung von #defines sogar zu nicht intuitiv nachvollziehbaren Zuständen:

    #define get_max(a, b) a > b ? a : b
    int a, b;
    ...
    int c = get_max(a++, b)
    

    In deinem Fall halte ich ein Macro für in Ordnung.



  • Ist in Ordnung, nur würde ich noch versuchen, den Namen so zu gestalten, daß er als Makro erkennbar ist.



  • Ok alles klar , danke für die Antworten 👍


Anmelden zum Antworten