2017-08-24 15:21:36 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								< a  id = "top" > < / a > 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Supplying main() yourself
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 19:09:38 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The easiest way to use Catch is to let it supply ```main()` `` for you and handle configuring itself from the command line.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This is achieved by writing ```#define CATCH_CONFIG_MAIN` `` before the ` ``#include "catch.hpp"` `` in *exactly one*  source file.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Sometimes, though, you need to write your own version of main(). You can do this by writing ```#define CATCH_CONFIG_RUNNER` `` instead. Now you are free to write ` ``main()` `` as normal and call into Catch yourself manually.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								You now have a lot of flexibility - but here are three recipes to get your started:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								## Let Catch take full control of args and config
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								If you just need to have code that executes before and/ or after Catch this is the simplest option.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```c++
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#define CATCH_CONFIG_RUNNER
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#include "catch.hpp"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-04 21:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								int main( int argc, char* argv[] ) {
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  // global setup...
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  int result = Catch::Session().run( argc, argv );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // global clean-up...
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-27 11:37:42 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  return result;
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								## Amending the config
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								If you still want Catch to process the command line, but you want to programatically tweak the config, you can do so in one of two ways:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```c++
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#define CATCH_CONFIG_RUNNER
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#include "catch.hpp"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-19 17:05:01 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								int main( int argc, char* argv[] )
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{
							 
						 
					
						
							
								
									
										
										
										
											2016-06-15 21:01:55 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  Catch::Session session; // There must be exactly one instance
							 
						 
					
						
							
								
									
										
										
										
											2017-11-02 18:01:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  // writing to session.configData() here sets defaults
							 
						 
					
						
							
								
									
										
										
										
											2013-07-02 19:42:21 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  // this is the preferred way to set them
							 
						 
					
						
							
								
									
										
										
										
											2017-11-02 18:01:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  int returnCode = session.applyCommandLine( argc, argv );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if( returnCode != 0 ) // Indicates a command line error
							 
						 
					
						
							
								
									
										
										
										
											2017-11-02 18:01:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  	  return returnCode;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  // writing to session.configData() or session.Config() here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // overrides command line args
							 
						 
					
						
							
								
									
										
										
										
											2013-07-02 19:42:21 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  // only do this if you know you need to
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-31 20:48:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  int numFailed = session.run();
							 
						 
					
						
							
								
									
										
										
										
											2017-11-02 18:01:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  
							 
						 
					
						
							
								
									
										
										
										
											2017-06-27 11:37:42 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  // numFailed is clamped to 255 as some unices only use the lower 8 bits.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // This clamping has already been applied, so just return it here
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // You can also do any post run clean-up here
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  return numFailed;
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 23:06:54 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Take a look at the definitions of Config and ConfigData to see what you can do with them.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								To take full control of the config simply omit the call to ```applyCommandLine()` ``.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								## Adding your own command line options
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-02 17:14:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Catch embeds a powerful command line parser called [Clara ](https://github.com/philsquared/Clara ). 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								As of Catch2 (and Clara 1.0) Clara allows you to write _composable_  option and argument parsers, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								so extending Catch's own command line options is now easy.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```c++
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#define CATCH_CONFIG_RUNNER
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#include "catch.hpp"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								int main( int argc, char* argv[] )
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Catch::Session session; // There must be exactly one instance
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  int height = 0; // Some user variable you want to be able to set
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Build a new parser on top of Catch's
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  auto cli 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    = session.cli() // Get Catch's composite command line parser
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    | Opt( height, "height" ) // bind variable to a new option, with a hint string
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ["-g"]["--height"]    // the option names it will respond to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ("how high?");        // description string for the help output
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Now pass the new composite back to Catch so it uses that
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  session.cli( cli ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Let Catch (using Clara) parse the command line
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  int returnCode = session.applyCommandLine( argc, argv );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if( returnCode != 0 ) // Indicates a command line error
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  	return returnCode;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // if set on the command line then 'height' is now set at this point
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if( height > 0 )
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      std::cout < <  "height: " < <  height  < <  std::endl ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  return session.run();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								See the [Clara documentation ](https://github.com/philsquared/Clara/blob/master/README.md ) for more details.
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 21:31:28 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-07 19:09:38 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 15:33:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								[Home ](Readme.md#top )