{"id":83249,"date":"2019-08-08T01:58:54","date_gmt":"2019-08-08T01:58:54","guid":{"rendered":"https:\/\/www.softwaretestinghelp.com\/?page_id=83249"},"modified":"2025-04-01T08:10:31","modified_gmt":"2025-04-01T08:10:31","slug":"preprocessor-directives-in-cpp","status":"publish","type":"page","link":"https:\/\/www.softwaretestinghelp.com\/preprocessor-directives-in-cpp\/","title":{"rendered":"Preprocessor Directives In C++"},"content":{"rendered":"<p><strong>A Detailed Look At Preprocessor Directives In C++.<\/strong><\/p>\n<p>The preprocessor is a unique feature of C++. In C++, we have steps like compilation, linking and execution for a typical program. In reality, we have a lot of other features in a C++ program that needs to be processed before passing the program for compilation.<\/p>\n<p>For this purpose, a special step called preprocessing is carried out. Preprocessing is carried out before the compilation process and the special features are preprocessed. As a result, an expanded C++ program is obtained and then it is passed to the compiler.<\/p>\n<p><strong>=&gt; <a href=\"https:\/\/www.softwaretestinghelp.com\/cpp-tutorials\/\">Visit Here To Learn C++ From Scratch.<\/a><\/strong><\/p>\n<p><em><strong> <\/strong><\/em><\/p>\n<p><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/06\/Preprocessor-Directives-In-C.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-83350\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/06\/Preprocessor-Directives-In-C.png\" alt=\"Preprocessor Directives In C++\" width=\"650\" height=\"366\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/06\/Preprocessor-Directives-In-C.png 650w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/06\/Preprocessor-Directives-In-C-300x169.png 300w\" sizes=\"(max-width: 650px) 100vw, 650px\" \/><\/a><\/p>\n<h3>Overview<\/h3>\n<p>The special features for preprocessing are identified using an entity called \u201cPreprocessor directive\u201d. These preprocessor directives tell the compiler that certain information in the C++ program marked with preprocessor directives need to be preprocessed before compilation.<\/p>\n<p>Note that in C++ all preprocessor directives begin with a \u201c#\u201d symbol. The moment the preprocessor (part of the compiler) encounters the # symbol, the information following the # symbol is preprocessed before passing the program to the compiler.<\/p>\n<p>Unlike the other C++ statements, preprocessor directives do not end with a semicolon.<\/p>\n<p><em><strong>In this tutorial, we will explore the various preprocessor directives supported by C++.<\/strong><\/em><\/p>\n<h3>File Inclusion Directives<\/h3>\n<h4><span style=\"color: #ff6600;\">#include<\/span><\/h4>\n<p>File inclusion directive #include allows us to include other files in our source program. We can include any header file that contains definitions of various predefined functions in our program using these functions. We can include header files in our program using the following syntax.<\/p>\n<pre><strong>#include &lt;filename&gt; <\/strong><\/pre>\n<p><span style=\"text-decoration: underline;\"><strong>Example:<\/strong><\/span>#include &lt;iostream&gt;<\/p>\n<p>We have already seen this in our C++ programs. The header iostream contains the functions required for input\/output data streaming like cout, cin, etc.<\/p>\n<p>As our programs grow larger or the functionality becomes complex, we might want to divide our program into various files or import functionality from the other files. In this case, we make use of user-defined files. To include user-defined files in our program we can make use of the following syntax of #include directive.<\/p>\n<pre><strong>#include \u201cfilename\u201d <\/strong><\/pre>\n<p><span style=\"text-decoration: underline;\"><strong>Example:<\/strong><\/span> #include \u201cvector_int.h\u201d<\/p>\n<p>This is a user-defined header file that we intend to include in our program in order to use its functionality.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>The below code Example shows the usage of the #include directive.<\/strong><\/span><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">#include &lt;iostream&gt;\r\nusing namespace std;\r\nint main()\r\n{\r\n  cout&lt;&lt;&quot;This is an example demonstrating inclusion directive #include&quot;;\r\n}<\/pre>\n<p><strong> Output:<\/strong><\/p>\n<p>This is an example demonstrating the inclusion directive #include.<\/p>\n<p>As shown, we have used the #include directive to include the functionality of the &lt;iostream&gt; header in our program.<\/p>\n<h3>Macro Definition Directives<\/h3>\n<h4><span style=\"color: #ff6600;\">#define<\/span><\/h4>\n<p>The #define directive is used to define the symbolic constants or macros in C++ program.<\/p>\n<p><strong> The general form of a #define directive is:<\/strong><\/p>\n<pre><strong>#define macro_name replacement code<\/strong><\/pre>\n<p>When a preprocessor encounters the macro in the program, the preprocessor replaces this macro with the code that is defined using the #define directive before the code is passed to the compiler.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>The below code Example shows a symbolic constant RADIUS that is defined using #define directive and its usage in the program.<\/strong><\/span><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">#include &lt;iostream&gt;\r\n#define RADIUS 5\r\nusing namespace std;\r\n\r\nint main()\r\n{\r\n  \r\ncout&lt;&lt;&quot;Area of a circle : &quot;&lt;&lt;3.142 * RADIUS * RADIUS;\r\n}<\/pre>\n<p><strong>Output:<\/strong><\/p>\n<p>Area of a circle : 78.55<\/p>\n<p>As shown in the program, we can make use of symbolic constant RADIUS in our code and it will be replaced by the value defined for it using the #define directive.<\/p>\n<p>We can use the #define directive to define a proper function code. These functions are usually small functions.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>An example is shown below.<\/strong><\/span><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">#include &lt;iostream&gt;\r\n#define REC_AREA(length, breadth) (length * breadth)\r\nusing namespace std;\r\n\r\nint main()\r\n{\r\n  int length = 20, breadth = 5, area;\r\n \r\n  area = REC_AREA(length, breadth);\r\n \r\n  cout &lt;&lt; &quot;Area of a rectangle is: &quot; &lt;&lt; area;\r\n \r\n  return 0;\r\n}<\/pre>\n<p><strong>Output:<\/strong><\/p>\n<p>Area of a rectangle is: 100<\/p>\n<p>Here using the #define directive we have defined a function REC_AREA that takes two arguments i.e. length and breadth and calculates the area of a rectangle. In the main function, we just make use of this macro and supply two arguments to it to obtain the area of a rectangle.<\/p>\n<h4><span style=\"color: #ff6600;\">#undef<\/span><\/h4>\n<p>Macros in a program defined with the #define directive last until it is undefined using the #undef directive. Once the program encounters #undef, the subsequent use of macro (undefined by #undef) will give a compilation error.<\/p>\n<p>In the above program, if we just give a statement #undef REC_AREA after the integer declarations, then the program will give a compilation error.<\/p>\n<h3><span style=\"color: #000000;\">Conditional Compilation Directives<\/span><\/h3>\n<p>Apart from the directives explained above, C++ also provides the following directives that can be used for conditional compilation of code. These directives can be used on similar lines of the if-else statement of C++.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>For Example,<\/strong><\/span> we can set DEBUG for a program ON or OFF using these conditional directives.<\/p>\n<p><strong>Some of the conditional compilation directives provided in C++ include:<\/strong><\/p>\n<ul>\n<li>#if<\/li>\n<li>#elif<\/li>\n<li>#endif<\/li>\n<li>#ifdef<\/li>\n<li>#ifndef<\/li>\n<li>#else<\/li>\n<\/ul>\n<p><strong>The below program demonstrates the usage of conditional compilation directives in a C++ program.<\/strong><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">#include &lt;iostream&gt;\r\nusing namespace std;\r\n#define DEBUG\r\n\r\n#define MAX(a,b) (((a)&gt;(b)) ? a : b)\r\n\r\nint main () {\r\n  int i, j;\r\n \r\n  i = 100;\r\n  j = 50;\r\n  \r\n#ifdef DEBUG\r\n  cout &lt;&lt;&quot;Trace: Start of main function&quot; &lt;&lt; endl;\r\n  #endif\r\n  \r\ncout &lt;&lt;&quot;The maximum is &quot; &lt;&lt; MAX(i, j) &lt;&lt; endl;\r\n  \r\n#undef MAX\r\n  \/\/cout &lt;&lt;&quot;The maximum is &quot; &lt;&lt; MAX(10,20) &lt;&lt; endl;\r\n \r\n  #ifdef DEBUG\r\n  cout &lt;&lt;&quot;Trace: End of main function&quot; &lt;&lt; endl;\r\n  #endif\r\n  return 0;\r\n}<\/pre>\n<p><strong> Output:<\/strong><\/p>\n<p>Trace: Start of main function<br \/>\nThe maximum is 100<br \/>\nTrace: End of main function<\/p>\n<p>In the above program, we use #ifdef &#8211; #endif directive to define a DEBUG for the program. Then we undefined the macro function MAX using the #undef directive. The conditional compilation directive constructs #ifdef &#8211; #endif checks if DEBUG is set and if it&#8217;s set, it prints few messages in the program.<\/p>\n<h3>The # &amp; ## Operators<\/h3>\n<p>The # and ## operators are two special operators that are respectively used to convert a text token into a string to be displayed and concatenate two tokens.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Below given is an Example demonstrating both these operators.<\/strong><\/span><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">#include &lt;iostream&gt;\r\nusing namespace std;\r\n\r\n#define MKSTR( x ) #x\r\n#define concat(a, b) a ## b\r\n\r\nint main () {\r\n  \r\n  cout &lt;&lt;&quot;MKSTR(Hello World) = &quot;&lt;&lt; MKSTR(Hello World) &lt;&lt; endl;\r\n  int xy = 100;\r\n \r\n  cout &lt;&lt;&quot;concat(x,y) = &quot;&lt;&lt;concat(x,y);\r\n  return 0;\r\n}<\/pre>\n<p><strong>Output:<\/strong><\/p>\n<p>MKSTR(Hello World) = Hello World<br \/>\nconcat(x,y) = 100<\/p>\n<p>In the above program, we define MKSTR with an argument x. It has body #x. When we print this MKSTR using the argument \u201cHello World\u201d, we see that because of #x, the argument is converted to a string and is displayed to the output.<\/p>\n<p>Next, we have defined a concat function with two arguments a and b. In the body we specify a##b. Expression a##b equals ab. Thus in the main function when we call concat(x,y), it actually evaluates to xy which is equal to the integer variable that we defined.<\/p>\n<h3>Other Directives<\/h3>\n<h4><span style=\"color: #ff6600;\">#error<\/span><\/h4>\n<p><strong>The general syntax of the #error directive is:<\/strong><\/p>\n<pre><strong>#error error_message<\/strong><\/pre>\n<p>When the compiler encounters #error directive, it displays the error_message and the compilation stops. The argument error_message can contain one or more words with or without quotes.<\/p>\n<h4><span style=\"color: #ff6600;\">#line<\/span><\/h4>\n<p>This tells the compiler to change the compiler\u2019s internally stored line number and filename to the given line number and filename.<\/p>\n<p><strong>#line<\/strong>\u00a0digit-sequence\u00a0[&#8220;filename&#8221;]<\/p>\n<p>The digit_sequence can be an integer constant.<\/p>\n<p><strong><em><span style=\"text-decoration: underline;\">Example:<\/span> #line 200 test.c<\/em><\/strong><\/p>\n<p>In the above example, the internally stored line number is set to 200 and the filename is changed to test.c.<\/p>\n<h4><span style=\"color: #ff6600;\">#pragma<\/span><\/h4>\n<p>Supplies implementation-defined instructions to the compiler. These instructions are specific to the compiler and the platform. If the instruction does not match, the directive is ignored without generating a syntax error.<\/p>\n<h3>Predefined Macros<\/h3>\n<p>C++ also defines numerous predefined macros that can be used by the programmers.<\/p>\n<p><strong>Some of these macros are tabularized below.<\/strong><\/p>\n\n<div id=\"tablepress-745-scroll-wrapper\" class=\"tablepress-scroll-wrapper\">\n<table id=\"tablepress-745\" class=\"tablepress tablepress-id-745 tablepress-responsive\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">Predefined Macro<\/th><th class=\"column-2\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">__FILE__<\/td><td class=\"column-2\">The current file name of the program being compiled<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">__DATE__<\/td><td class=\"column-2\">Date of translation of source code into object code in the format month\/day\/year<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">__TIME__<\/td><td class=\"column-2\">Time in the form hour:minute:second at which program is compiled<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">__LINE__<\/td><td class=\"column-2\">The current line number of the program that is being compiled<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">__cplusplus<\/td><td class=\"column-2\">Integer constant that is defined for each compiler version<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<!-- #tablepress-745 from cache -->\n<p><strong>The following program demonstrates these macros in a program.<\/strong><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">#include &lt;iostream&gt;\r\nusing namespace std;\r\n\r\nint main () {\r\n  cout&lt;&lt;&quot;__LINE__ :&quot; &lt;&lt; __LINE__ &lt;&lt; endl;\r\n  cout&lt;&lt;&quot;__FILE__ :&quot; &lt;&lt; __FILE__ &lt;&lt; endl;\r\n  cout&lt;&lt;&quot;__DATE__ :&quot; &lt;&lt; __DATE__ &lt;&lt; endl;\r\n  cout&lt;&lt;&quot;__TIME__ :&quot; &lt;&lt; __TIME__ &lt;&lt; endl;\r\n  cout&lt;&lt;&quot;__cplusplus:&quot;&lt;&lt;__cplusplus&lt;&lt;endl;\r\n \r\n}<\/pre>\n<p><strong>Output:<\/strong><\/p>\n<p>__LINE__ :5<br \/>\n__FILE__ :prog.cpp<br \/>\n__DATE__ :Apr 15 2019<br \/>\n__TIME__ :12:09:15<br \/>\n__cplusplus:201402<\/p>\n<p>The program output above is in line with the explanation of the predefined macros above and is self-explanatory.<\/p>\n<h3>Conclusion<\/h3>\n<p>In this tutorial, we have seen various preprocessor directives provided by C++ along with their examples. Preprocessor directives help us write more efficient programs and more readable programs to some extent.<\/p>\n<p>The conditional compilation directives also allow us to branch our program output in various ways.<\/p>\n<p><strong>=&gt; <a href=\"https:\/\/www.softwaretestinghelp.com\/cpp-tutorials\/\">Look For The Entire C++ Training Series Here.<\/a><\/strong><\/p>\n\r\n\t\t\t<div id=\"daexthefup-container\"\r\n\t\t\t\tclass=\"daexthefup-container daexthefup-layout-stacked daexthefup-alignment-center\"\r\n\t\t\t\tdata-post-id=\"83249\">\r\n\r\n\t\t\t\t<div class=\"daexthefup-feedback\">\r\n\t\t\t\t\t<div class=\"daexthefup-text\">\r\n\t\t\t\t\t\t<h3 class=\"daexthefup-title\">Was this helpful?<\/h3>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"daexthefup-buttons-container\">\r\n\t\t\t\t\t\t<div class=\"daexthefup-buttons\">\r\n\t\t\t\t\t\t\t\r\n\t\t\t<div class=\"daexthefup-yes daexthefup-button daexthefup-button-type-icon\" data-value=\"1\">\r\n\t\t\t\t\r\n                <svg>\r\n                    <defs>\r\n                        <style>.thumb-up-cls-1{fill:#c9c9c9;}.thumb-up-cls-2{fill:#e1e1e1;}.thumb-up-cls-3{fill:#676767;}<\/style>\r\n                    <\/defs>\r\n                    <g id=\"thumb_up\">\r\n                        <path class=\"thumb-up-cls-2 daexthefup-icon-circle\" d=\"m24,3c11.58,0,21,9.42,21,21s-9.42,21-21,21S3,35.58,3,24,12.42,3,24,3m0-1C11.85,2,2,11.85,2,24s9.85,22,22,22,22-9.85,22-22S36.15,2,24,2h0Z\" \/>\r\n                        <g>\r\n                            <rect class=\"thumb-up-cls-3 daexthefup-icon-secondary-color\" x=\"10\" y=\"20\" width=\"6\" height=\"15\" rx=\"1.5\" ry=\"1.5\" \/>\r\n                            <path class=\"thumb-up-cls-1 daexthefup-icon-primary-color\" d=\"m30.57,9.06l-.49-.1c-.81-.17-1.61.35-1.78,1.16l-5.3,11.74c-.17.81,3.16,1.61,3.97,1.78l1.96.41c.81.17,1.61-.35,1.78-1.16l2.18-10.27c.34-1.61-.7-3.21-2.31-3.56Z\" \/>\r\n                            <path class=\"thumb-up-cls-1 daexthefup-icon-primary-color\" d=\"m38.17,20h-18.67c-.83,0-1.5.67-1.5,1.5v12c0,.83.67,1.5,1.5,1.5h16.27c.71,0,1.33-.5,1.47-1.21l2.4-12c.19-.93-.53-1.8-1.47-1.8Z\" \/>\r\n                        <\/g>\r\n                    <\/g>\r\n                <\/svg>\t\t\t<\/div>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t<div class=\"daexthefup-no daexthefup-button daexthefup-button-type-icon\" data-value=\"0\">\r\n\t\t\t\t\r\n                <svg>\r\n                    <defs>\r\n                        <style>.thumb-down-cls-1{fill:#c9c9c9;}.thumb-down-cls-2{fill:#e1e1e1;}.thumb-down-cls-3{fill:#676767;}<\/style>\r\n                    <\/defs>\r\n                    <g id=\"thumb_down\">\r\n                        <path class=\"thumb-down-cls-2 daexthefup-icon-circle\" d=\"m24,3c11.58,0,21,9.42,21,21s-9.42,21-21,21S3,35.58,3,24,12.42,3,24,3m0-1C11.85,2,2,11.85,2,24s9.85,22,22,22,22-9.85,22-22S36.15,2,24,2h0Z\" \/>\r\n                        <g>\r\n                            <rect class=\"thumb-down-cls-3 daexthefup-icon-secondary-color\" x=\"10\" y=\"13\" width=\"6\" height=\"15\" rx=\"1.5\" ry=\"1.5\" \/>\r\n                            <path class=\"thumb-down-cls-1 daexthefup-icon-primary-color\" d=\"m30.57,38.94l-.49.1c-.81.17-1.61-.35-1.78-1.16l-5.3-11.74c-.17-.81,3.16-1.61,3.97-1.78l1.96-.41c.81-.17,1.61.35,1.78,1.16l2.18,10.27c.34,1.61-.7,3.21-2.31,3.56Z\" \/>\r\n                            <path class=\"thumb-down-cls-1 daexthefup-icon-primary-color\" d=\"m38.17,28h-18.67c-.83,0-1.5-.67-1.5-1.5v-12c0-.83.67-1.5,1.5-1.5h16.27c.71,0,1.33.5,1.47,1.21l2.4,12c.19.93-.53,1.8-1.47,1.8Z\" \/>\r\n                        <\/g>\r\n                    <\/g>\r\n                <\/svg>\t\t\t<\/div>\r\n\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\r\n\t\t\t\t<div class=\"daexthefup-comment\">\r\n\t\t\t\t\t<div class=\"daexthefup-comment-top-container\">\r\n\t\t\t\t\t\t<label id=\"daexthefup-comment-label\" class=\"daexthefup-comment-label\"><\/label>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"daexthefup-comment-character-counter-container\">\r\n\t\t\t\t\t\t\t\t<div id=\"daexthefup-comment-character-counter-number\"\r\n\t\t\t\t\t\t\t\t\tclass=\"daexthefup-comment-character-counter-number\"><\/div>\r\n\t\t\t\t\t\t\t\t<div class=\"daexthefup-comment-character-counter-text\"><\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<textarea id=\"daexthefup-comment-textarea\" class=\"daexthefup-comment-textarea\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Type your message\"\r\n\t\t\t\t\t\t\t\tmaxlength=\"\r\n\t\t\t\t\t\t\t\t400\t\t\t\t\t\t\t\t\t\"><\/textarea>\r\n\t\t\t\t\t<div class=\"daexthefup-comment-buttons-container\">\r\n\t\t\t\t\t\t<button class=\"daexthefup-comment-submit daexthefup-button\">Submit<\/button>\r\n\t\t\t\t\t\t<button class=\"daexthefup-comment-cancel daexthefup-button\">Cancel<\/button>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\r\n\t\t\t\t<div class=\"daexthefup-successful-submission-text\">Thanks for your feedback!<\/div>\r\n\r\n\t\t\t<\/div>\r\n\r\n\t\t\t","protected":false},"excerpt":{"rendered":"<p>A Detailed Look At Preprocessor Directives In C++. The preprocessor is a unique feature of C++. In C++, we have steps like compilation, linking and execution for a typical program. In reality, we have a lot of other features in a C++ program that needs to be processed before passing &#8230; <\/p>\n<p class=\"read-more-container\"><a title=\"Preprocessor Directives In C++\" class=\"read-more button\" href=\"https:\/\/www.softwaretestinghelp.com\/preprocessor-directives-in-cpp\/#more-83249\" aria-label=\"Read more about Preprocessor Directives In C++\">Read more<\/a><\/p>\n","protected":false},"author":9,"featured_media":83350,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_helpful_pro_status":1,"footnotes":""},"categories":[403],"tags":[],"class_list":{"0":"post-83249","1":"page","2":"type-page","3":"status-publish","4":"has-post-thumbnail","6":"category-cpp"},"acf":[],"_links":{"self":[{"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/pages\/83249","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/comments?post=83249"}],"version-history":[{"count":0,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/pages\/83249\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/media\/83350"}],"wp:attachment":[{"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/media?parent=83249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/categories?post=83249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/tags?post=83249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}