/usr/share/doc/gcc-4.6-base/cpp.html is in cpp-4.6-doc 4.6.3-1ubuntu5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 | <html lang="en">
<head>
<title>The C Preprocessor</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The C Preprocessor">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="top" href="#Top">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation. A copy of
the license is included in the
section entitled "GNU Free Documentation License".
This manual contains no Invariant Sections. The Front-Cover Texts are
(a) (see below), and the Back-Cover Texts are (b) (see below).
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development.
-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
</head>
<body>
<h1 class="settitle">The C Preprocessor</h1>
<div class="contents">
<h2>Table of Contents</h2>
<ul>
<li><a name="toc_Top" href="#Top">The C Preprocessor</a>
<li><a name="toc_Overview" href="#Overview">1 Overview</a>
<ul>
<li><a href="#Character-sets">1.1 Character sets</a>
<li><a href="#Initial-processing">1.2 Initial processing</a>
<li><a href="#Tokenization">1.3 Tokenization</a>
<li><a href="#The-preprocessing-language">1.4 The preprocessing language</a>
</li></ul>
<li><a name="toc_Header-Files" href="#Header-Files">2 Header Files</a>
<ul>
<li><a href="#Include-Syntax">2.1 Include Syntax</a>
<li><a href="#Include-Operation">2.2 Include Operation</a>
<li><a href="#Search-Path">2.3 Search Path</a>
<li><a href="#Once_002dOnly-Headers">2.4 Once-Only Headers</a>
<li><a href="#Alternatives-to-Wrapper-_0023ifndef">2.5 Alternatives to Wrapper #ifndef</a>
<li><a href="#Computed-Includes">2.6 Computed Includes</a>
<li><a href="#Wrapper-Headers">2.7 Wrapper Headers</a>
<li><a href="#System-Headers">2.8 System Headers</a>
</li></ul>
<li><a name="toc_Macros" href="#Macros">3 Macros</a>
<ul>
<li><a href="#Object_002dlike-Macros">3.1 Object-like Macros</a>
<li><a href="#Function_002dlike-Macros">3.2 Function-like Macros</a>
<li><a href="#Macro-Arguments">3.3 Macro Arguments</a>
<li><a href="#Stringification">3.4 Stringification</a>
<li><a href="#Concatenation">3.5 Concatenation</a>
<li><a href="#Variadic-Macros">3.6 Variadic Macros</a>
<li><a href="#Predefined-Macros">3.7 Predefined Macros</a>
<ul>
<li><a href="#Standard-Predefined-Macros">3.7.1 Standard Predefined Macros</a>
<li><a href="#Common-Predefined-Macros">3.7.2 Common Predefined Macros</a>
<li><a href="#System_002dspecific-Predefined-Macros">3.7.3 System-specific Predefined Macros</a>
<li><a href="#C_002b_002b-Named-Operators">3.7.4 C++ Named Operators</a>
</li></ul>
<li><a href="#Undefining-and-Redefining-Macros">3.8 Undefining and Redefining Macros</a>
<li><a href="#Directives-Within-Macro-Arguments">3.9 Directives Within Macro Arguments</a>
<li><a href="#Macro-Pitfalls">3.10 Macro Pitfalls</a>
<ul>
<li><a href="#Misnesting">3.10.1 Misnesting</a>
<li><a href="#Operator-Precedence-Problems">3.10.2 Operator Precedence Problems</a>
<li><a href="#Swallowing-the-Semicolon">3.10.3 Swallowing the Semicolon</a>
<li><a href="#Duplication-of-Side-Effects">3.10.4 Duplication of Side Effects</a>
<li><a href="#Self_002dReferential-Macros">3.10.5 Self-Referential Macros</a>
<li><a href="#Argument-Prescan">3.10.6 Argument Prescan</a>
<li><a href="#Newlines-in-Arguments">3.10.7 Newlines in Arguments</a>
</li></ul>
</li></ul>
<li><a name="toc_Conditionals" href="#Conditionals">4 Conditionals</a>
<ul>
<li><a href="#Conditional-Uses">4.1 Conditional Uses</a>
<li><a href="#Conditional-Syntax">4.2 Conditional Syntax</a>
<ul>
<li><a href="#Ifdef">4.2.1 Ifdef</a>
<li><a href="#If">4.2.2 If</a>
<li><a href="#Defined">4.2.3 Defined</a>
<li><a href="#Else">4.2.4 Else</a>
<li><a href="#Elif">4.2.5 Elif</a>
</li></ul>
<li><a href="#Deleted-Code">4.3 Deleted Code</a>
</li></ul>
<li><a name="toc_Diagnostics" href="#Diagnostics">5 Diagnostics</a>
<li><a name="toc_Line-Control" href="#Line-Control">6 Line Control</a>
<li><a name="toc_Pragmas" href="#Pragmas">7 Pragmas</a>
<li><a name="toc_Other-Directives" href="#Other-Directives">8 Other Directives</a>
<li><a name="toc_Preprocessor-Output" href="#Preprocessor-Output">9 Preprocessor Output</a>
<li><a name="toc_Traditional-Mode" href="#Traditional-Mode">10 Traditional Mode</a>
<ul>
<li><a href="#Traditional-lexical-analysis">10.1 Traditional lexical analysis</a>
<li><a href="#Traditional-macros">10.2 Traditional macros</a>
<li><a href="#Traditional-miscellany">10.3 Traditional miscellany</a>
<li><a href="#Traditional-warnings">10.4 Traditional warnings</a>
</li></ul>
<li><a name="toc_Implementation-Details" href="#Implementation-Details">11 Implementation Details</a>
<ul>
<li><a href="#Implementation_002ddefined-behavior">11.1 Implementation-defined behavior</a>
<li><a href="#Implementation-limits">11.2 Implementation limits</a>
<li><a href="#Obsolete-Features">11.3 Obsolete Features</a>
<ul>
<li><a href="#Obsolete-Features">11.3.1 Assertions</a>
</li></ul>
<li><a href="#Differences-from-previous-versions">11.4 Differences from previous versions</a>
</li></ul>
<li><a name="toc_Invocation" href="#Invocation">12 Invocation</a>
<li><a name="toc_Environment-Variables" href="#Environment-Variables">13 Environment Variables</a>
<li><a name="toc_GNU-Free-Documentation-License" href="#GNU-Free-Documentation-License">GNU Free Documentation License</a>
<ul>
<li><a href="#GNU-Free-Documentation-License">ADDENDUM: How to use this License for your documents</a>
</li></ul>
<li><a name="toc_Index-of-Directives" href="#Index-of-Directives">Index of Directives</a>
<li><a name="toc_Option-Index" href="#Option-Index">Option Index</a>
<li><a name="toc_Concept-Index" href="#Concept-Index">Concept Index</a>
</li></ul>
</div>
<div class="node">
<a name="Top"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Overview">Overview</a>,
Up: <a rel="up" accesskey="u" href="#dir">(dir)</a>
</div>
<h2 class="unnumbered">The C Preprocessor</h2>
<p>The C preprocessor implements the macro language used to transform C,
C++, and Objective-C programs before they are compiled. It can also be
useful on its own.
<ul class="menu">
<li><a accesskey="1" href="#Overview">Overview</a>
<li><a accesskey="2" href="#Header-Files">Header Files</a>
<li><a accesskey="3" href="#Macros">Macros</a>
<li><a accesskey="4" href="#Conditionals">Conditionals</a>
<li><a accesskey="5" href="#Diagnostics">Diagnostics</a>
<li><a accesskey="6" href="#Line-Control">Line Control</a>
<li><a accesskey="7" href="#Pragmas">Pragmas</a>
<li><a accesskey="8" href="#Other-Directives">Other Directives</a>
<li><a accesskey="9" href="#Preprocessor-Output">Preprocessor Output</a>
<li><a href="#Traditional-Mode">Traditional Mode</a>
<li><a href="#Implementation-Details">Implementation Details</a>
<li><a href="#Invocation">Invocation</a>
<li><a href="#Environment-Variables">Environment Variables</a>
<li><a href="#GNU-Free-Documentation-License">GNU Free Documentation License</a>
<li><a href="#Index-of-Directives">Index of Directives</a>
<li><a href="#Option-Index">Option Index</a>
<li><a href="#Concept-Index">Concept Index</a>
</li></ul>
<p>--- The Detailed Node Listing ---
<p>Overview
</p>
<ul class="menu">
<li><a href="#Character-sets">Character sets</a>
<li><a href="#Initial-processing">Initial processing</a>
<li><a href="#Tokenization">Tokenization</a>
<li><a href="#The-preprocessing-language">The preprocessing language</a>
</li></ul>
<p>Header Files
</p>
<ul class="menu">
<li><a href="#Include-Syntax">Include Syntax</a>
<li><a href="#Include-Operation">Include Operation</a>
<li><a href="#Search-Path">Search Path</a>
<li><a href="#Once_002dOnly-Headers">Once-Only Headers</a>
<li><a href="#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a>
<li><a href="#Computed-Includes">Computed Includes</a>
<li><a href="#Wrapper-Headers">Wrapper Headers</a>
<li><a href="#System-Headers">System Headers</a>
</li></ul>
<p>Macros
</p>
<ul class="menu">
<li><a href="#Object_002dlike-Macros">Object-like Macros</a>
<li><a href="#Function_002dlike-Macros">Function-like Macros</a>
<li><a href="#Macro-Arguments">Macro Arguments</a>
<li><a href="#Stringification">Stringification</a>
<li><a href="#Concatenation">Concatenation</a>
<li><a href="#Variadic-Macros">Variadic Macros</a>
<li><a href="#Predefined-Macros">Predefined Macros</a>
<li><a href="#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a>
<li><a href="#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a>
<li><a href="#Macro-Pitfalls">Macro Pitfalls</a>
</li></ul>
<p>Predefined Macros
</p>
<ul class="menu">
<li><a href="#Standard-Predefined-Macros">Standard Predefined Macros</a>
<li><a href="#Common-Predefined-Macros">Common Predefined Macros</a>
<li><a href="#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>
<li><a href="#C_002b_002b-Named-Operators">C++ Named Operators</a>
</li></ul>
<p>Macro Pitfalls
</p>
<ul class="menu">
<li><a href="#Misnesting">Misnesting</a>
<li><a href="#Operator-Precedence-Problems">Operator Precedence Problems</a>
<li><a href="#Swallowing-the-Semicolon">Swallowing the Semicolon</a>
<li><a href="#Duplication-of-Side-Effects">Duplication of Side Effects</a>
<li><a href="#Self_002dReferential-Macros">Self-Referential Macros</a>
<li><a href="#Argument-Prescan">Argument Prescan</a>
<li><a href="#Newlines-in-Arguments">Newlines in Arguments</a>
</li></ul>
<p>Conditionals
</p>
<ul class="menu">
<li><a href="#Conditional-Uses">Conditional Uses</a>
<li><a href="#Conditional-Syntax">Conditional Syntax</a>
<li><a href="#Deleted-Code">Deleted Code</a>
</li></ul>
<p>Conditional Syntax
</p>
<ul class="menu">
<li><a href="#Ifdef">Ifdef</a>
<li><a href="#If">If</a>
<li><a href="#Defined">Defined</a>
<li><a href="#Else">Else</a>
<li><a href="#Elif">Elif</a>
</li></ul>
<p>Implementation Details
</p>
<ul class="menu">
<li><a href="#Implementation_002ddefined-behavior">Implementation-defined behavior</a>
<li><a href="#Implementation-limits">Implementation limits</a>
<li><a href="#Obsolete-Features">Obsolete Features</a>
<li><a href="#Differences-from-previous-versions">Differences from previous versions</a>
</li></ul>
<p>Obsolete Features
</p>
<ul class="menu">
<li><a href="#Obsolete-Features">Obsolete Features</a>
</ul>
<!-- man begin COPYRIGHT -->
<p>Copyright © 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008, 2009, 2010, 2011
Free Software Foundation, Inc.
<p>Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation. A copy of
the license is included in the
<!-- man end -->
section entitled “GNU Free Documentation License”.
<!-- man begin COPYRIGHT -->
<p>This manual contains no Invariant Sections. The Front-Cover Texts are
(a) (see below), and the Back-Cover Texts are (b) (see below).
<p>(a) The FSF's Front-Cover Text is:
<p>A GNU Manual
<p>(b) The FSF's Back-Cover Text is:
<p>You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development.
<!-- man end -->
<div class="node">
<a name="Overview"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Header-Files">Header Files</a>,
Previous: <a rel="previous" accesskey="p" href="#Top">Top</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">1 Overview</h2>
<!-- man begin DESCRIPTION -->
<p>The C preprocessor, often known as <dfn>cpp</dfn>, is a <dfn>macro processor</dfn>
that is used automatically by the C compiler to transform your program
before compilation. It is called a macro processor because it allows
you to define <dfn>macros</dfn>, which are brief abbreviations for longer
constructs.
<p>The C preprocessor is intended to be used only with C, C++, and
Objective-C source code. In the past, it has been abused as a general
text processor. It will choke on input which does not obey C's lexical
rules. For example, apostrophes will be interpreted as the beginning of
character constants, and cause errors. Also, you cannot rely on it
preserving characteristics of the input which are not significant to
C-family languages. If a Makefile is preprocessed, all the hard tabs
will be removed, and the Makefile will not work.
<p>Having said that, you can often get away with using cpp on things which
are not C. Other Algol-ish programming languages are often safe
(Pascal, Ada, etc.) So is assembly, with caution. <samp><span class="option">-traditional-cpp</span></samp>
mode preserves more white space, and is otherwise more permissive. Many
of the problems can be avoided by writing C or C++ style comments
instead of native language comments, and keeping macros simple.
<p>Wherever possible, you should use a preprocessor geared to the language
you are writing in. Modern versions of the GNU assembler have macro
facilities. Most high level programming languages have their own
conditional compilation and inclusion mechanism. If all else fails,
try a true general text processor, such as GNU M4.
<p>C preprocessors vary in some details. This manual discusses the GNU C
preprocessor, which provides a small superset of the features of ISO
Standard C. In its default mode, the GNU C preprocessor does not do a
few things required by the standard. These are features which are
rarely, if ever, used, and may cause surprising changes to the meaning
of a program which does not expect them. To get strict ISO Standard C,
you should use the <samp><span class="option">-std=c90</span></samp>, <samp><span class="option">-std=c99</span></samp> or
<samp><span class="option">-std=c1x</span></samp> options, depending
on which version of the standard you want. To get all the mandatory
diagnostics, you must also use <samp><span class="option">-pedantic</span></samp>. See <a href="#Invocation">Invocation</a>.
<p>This manual describes the behavior of the ISO preprocessor. To
minimize gratuitous differences, where the ISO preprocessor's
behavior does not conflict with traditional semantics, the
traditional preprocessor should behave the same way. The various
differences that do exist are detailed in the section <a href="#Traditional-Mode">Traditional Mode</a>.
<p>For clarity, unless noted otherwise, references to ‘<samp><span class="samp">CPP</span></samp>’ in this
manual refer to GNU CPP.
<!-- man end -->
<ul class="menu">
<li><a accesskey="1" href="#Character-sets">Character sets</a>
<li><a accesskey="2" href="#Initial-processing">Initial processing</a>
<li><a accesskey="3" href="#Tokenization">Tokenization</a>
<li><a accesskey="4" href="#The-preprocessing-language">The preprocessing language</a>
</ul>
<div class="node">
<a name="Character-sets"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Initial-processing">Initial processing</a>,
Up: <a rel="up" accesskey="u" href="#Overview">Overview</a>
</div>
<h3 class="section">1.1 Character sets</h3>
<p>Source code character set processing in C and related languages is
rather complicated. The C standard discusses two character sets, but
there are really at least four.
<p>The files input to CPP might be in any character set at all. CPP's
very first action, before it even looks for line boundaries, is to
convert the file into the character set it uses for internal
processing. That set is what the C standard calls the <dfn>source</dfn>
character set. It must be isomorphic with ISO 10646, also known as
Unicode. CPP uses the UTF-8 encoding of Unicode.
<p>The character sets of the input files are specified using the
<samp><span class="option">-finput-charset=</span></samp> option.
<p>All preprocessing work (the subject of the rest of this manual) is
carried out in the source character set. If you request textual
output from the preprocessor with the <samp><span class="option">-E</span></samp> option, it will be
in UTF-8.
<p>After preprocessing is complete, string and character constants are
converted again, into the <dfn>execution</dfn> character set. This
character set is under control of the user; the default is UTF-8,
matching the source character set. Wide string and character
constants have their own character set, which is not called out
specifically in the standard. Again, it is under control of the user.
The default is UTF-16 or UTF-32, whichever fits in the target's
<code>wchar_t</code> type, in the target machine's byte
order.<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a> Octal and hexadecimal escape sequences do not undergo
conversion; <tt>'\x12'</tt> has the value 0x12 regardless of the currently
selected execution character set. All other escapes are replaced by
the character in the source character set that they represent, then
converted to the execution character set, just like unescaped
characters.
<p>Unless the experimental <samp><span class="option">-fextended-identifiers</span></samp> option is used,
GCC does not permit the use of characters outside the ASCII range, nor
‘<samp><span class="samp">\u</span></samp>’ and ‘<samp><span class="samp">\U</span></samp>’ escapes, in identifiers. Even with that
option, characters outside the ASCII range can only be specified with
the ‘<samp><span class="samp">\u</span></samp>’ and ‘<samp><span class="samp">\U</span></samp>’ escapes, not used directly in identifiers.
<div class="node">
<a name="Initial-processing"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Tokenization">Tokenization</a>,
Previous: <a rel="previous" accesskey="p" href="#Character-sets">Character sets</a>,
Up: <a rel="up" accesskey="u" href="#Overview">Overview</a>
</div>
<h3 class="section">1.2 Initial processing</h3>
<p>The preprocessor performs a series of textual transformations on its
input. These happen before all other processing. Conceptually, they
happen in a rigid order, and the entire file is run through each
transformation before the next one begins. CPP actually does them
all at once, for performance reasons. These transformations correspond
roughly to the first three “phases of translation” described in the C
standard.
<ol type=1 start=1>
<li><a name="index-line-endings-1"></a>The input file is read into memory and broken into lines.
<p>Different systems use different conventions to indicate the end of a
line. GCC accepts the ASCII control sequences <kbd>LF</kbd>, <kbd>CR LF<!-- /@w --></kbd> and <kbd>CR</kbd> as end-of-line markers. These are the canonical
sequences used by Unix, DOS and VMS, and the classic Mac OS (before
OSX) respectively. You may therefore safely copy source code written
on any of those systems to a different one and use it without
conversion. (GCC may lose track of the current line number if a file
doesn't consistently use one convention, as sometimes happens when it
is edited on computers with different conventions that share a network
file system.)
<p>If the last line of any input file lacks an end-of-line marker, the end
of the file is considered to implicitly supply one. The C standard says
that this condition provokes undefined behavior, so GCC will emit a
warning message.
<li><a name="index-trigraphs-2"></a><a name="trigraphs"></a>If trigraphs are enabled, they are replaced by their
corresponding single characters. By default GCC ignores trigraphs,
but if you request a strictly conforming mode with the <samp><span class="option">-std</span></samp>
option, or you specify the <samp><span class="option">-trigraphs</span></samp> option, then it
converts them.
<p>These are nine three-character sequences, all starting with ‘<samp><span class="samp">??</span></samp>’,
that are defined by ISO C to stand for single characters. They permit
obsolete systems that lack some of C's punctuation to use C. For
example, ‘<samp><span class="samp">??/</span></samp>’ stands for ‘<samp><span class="samp">\</span></samp>’, so <tt>'??/n'</tt> is a character
constant for a newline.
<p>Trigraphs are not popular and many compilers implement them
incorrectly. Portable code should not rely on trigraphs being either
converted or ignored. With <samp><span class="option">-Wtrigraphs</span></samp> GCC will warn you
when a trigraph may change the meaning of your program if it were
converted. See <a href="#Wtrigraphs">Wtrigraphs</a>.
<p>In a string constant, you can prevent a sequence of question marks
from being confused with a trigraph by inserting a backslash between
the question marks, or by separating the string literal at the
trigraph and making use of string literal concatenation. <tt>"(??\?)"</tt>
is the string ‘<samp><span class="samp">(???)</span></samp>’, not ‘<samp><span class="samp">(?]</span></samp>’. Traditional C compilers
do not recognize these idioms.
<p>The nine trigraphs and their replacements are
<pre class="smallexample"> Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??-
Replacement: [ ] { } # \ ^ | ~
</pre>
<li><a name="index-continued-lines-3"></a><a name="index-backslash_002dnewline-4"></a>Continued lines are merged into one long line.
<p>A continued line is a line which ends with a backslash, ‘<samp><span class="samp">\</span></samp>’. The
backslash is removed and the following line is joined with the current
one. No space is inserted, so you may split a line anywhere, even in
the middle of a word. (It is generally more readable to split lines
only at white space.)
<p>The trailing backslash on a continued line is commonly referred to as a
<dfn>backslash-newline</dfn>.
<p>If there is white space between a backslash and the end of a line, that
is still a continued line. However, as this is usually the result of an
editing mistake, and many compilers will not accept it as a continued
line, GCC will warn you about it.
<li><a name="index-comments-5"></a><a name="index-line-comments-6"></a><a name="index-block-comments-7"></a>All comments are replaced with single spaces.
<p>There are two kinds of comments. <dfn>Block comments</dfn> begin with
‘<samp><span class="samp">/*</span></samp>’ and continue until the next ‘<samp><span class="samp">*/</span></samp>’. Block comments do not
nest:
<pre class="smallexample"> /* <span class="roman">this is</span> /* <span class="roman">one comment</span> */ <span class="roman">text outside comment</span>
</pre>
<p><dfn>Line comments</dfn> begin with ‘<samp><span class="samp">//</span></samp>’ and continue to the end of the
current line. Line comments do not nest either, but it does not matter,
because they would end in the same place anyway.
<pre class="smallexample"> // <span class="roman">this is</span> // <span class="roman">one comment</span>
<span class="roman">text outside comment</span>
</pre>
</ol>
<p>It is safe to put line comments inside block comments, or vice versa.
<pre class="smallexample"> /* <span class="roman">block comment</span>
// <span class="roman">contains line comment</span>
<span class="roman">yet more comment</span>
*/ <span class="roman">outside comment</span>
// <span class="roman">line comment</span> /* <span class="roman">contains block comment</span> */
</pre>
<p>But beware of commenting out one end of a block comment with a line
comment.
<pre class="smallexample"> // <span class="roman">l.c.</span> /* <span class="roman">block comment begins</span>
<span class="roman">oops! this isn't a comment anymore</span> */
</pre>
<p>Comments are not recognized within string literals.
<tt>"/* blah */"<!-- /@w --></tt> is the string constant ‘<samp><span class="samp">/* blah */<!-- /@w --></span></samp>’, not
an empty string.
<p>Line comments are not in the 1989 edition of the C standard, but they
are recognized by GCC as an extension. In C++ and in the 1999 edition
of the C standard, they are an official part of the language.
<p>Since these transformations happen before all other processing, you can
split a line mechanically with backslash-newline anywhere. You can
comment out the end of a line. You can continue a line comment onto the
next line with backslash-newline. You can even split ‘<samp><span class="samp">/*</span></samp>’,
‘<samp><span class="samp">*/</span></samp>’, and ‘<samp><span class="samp">//</span></samp>’ onto multiple lines with backslash-newline.
For example:
<pre class="smallexample"> /\
*
*/ # /*
*/ defi\
ne FO\
O 10\
20
</pre>
<p class="noindent">is equivalent to <code>#define FOO 1020<!-- /@w --></code>. All these tricks are
extremely confusing and should not be used in code intended to be
readable.
<p>There is no way to prevent a backslash at the end of a line from being
interpreted as a backslash-newline. This cannot affect any correct
program, however.
<div class="node">
<a name="Tokenization"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#The-preprocessing-language">The preprocessing language</a>,
Previous: <a rel="previous" accesskey="p" href="#Initial-processing">Initial processing</a>,
Up: <a rel="up" accesskey="u" href="#Overview">Overview</a>
</div>
<h3 class="section">1.3 Tokenization</h3>
<p><a name="index-tokens-8"></a><a name="index-preprocessing-tokens-9"></a>After the textual transformations are finished, the input file is
converted into a sequence of <dfn>preprocessing tokens</dfn>. These mostly
correspond to the syntactic tokens used by the C compiler, but there are
a few differences. White space separates tokens; it is not itself a
token of any kind. Tokens do not have to be separated by white space,
but it is often necessary to avoid ambiguities.
<p>When faced with a sequence of characters that has more than one possible
tokenization, the preprocessor is greedy. It always makes each token,
starting from the left, as big as possible before moving on to the next
token. For instance, <code>a+++++b</code> is interpreted as
<code>a ++ ++ + b<!-- /@w --></code>, not as <code>a ++ + ++ b<!-- /@w --></code>, even though the
latter tokenization could be part of a valid C program and the former
could not.
<p>Once the input file is broken into tokens, the token boundaries never
change, except when the ‘<samp><span class="samp">##</span></samp>’ preprocessing operator is used to paste
tokens together. See <a href="#Concatenation">Concatenation</a>. For example,
<pre class="smallexample"> #define foo() bar
foo()baz
==> bar baz
<em>not</em>
==> barbaz
</pre>
<p>The compiler does not re-tokenize the preprocessor's output. Each
preprocessing token becomes one compiler token.
<p><a name="index-identifiers-10"></a>Preprocessing tokens fall into five broad classes: identifiers,
preprocessing numbers, string literals, punctuators, and other. An
<dfn>identifier</dfn> is the same as an identifier in C: any sequence of
letters, digits, or underscores, which begins with a letter or
underscore. Keywords of C have no significance to the preprocessor;
they are ordinary identifiers. You can define a macro whose name is a
keyword, for instance. The only identifier which can be considered a
preprocessing keyword is <code>defined</code>. See <a href="#Defined">Defined</a>.
<p>This is mostly true of other languages which use the C preprocessor.
However, a few of the keywords of C++ are significant even in the
preprocessor. See <a href="#C_002b_002b-Named-Operators">C++ Named Operators</a>.
<p>In the 1999 C standard, identifiers may contain letters which are not
part of the “basic source character set”, at the implementation's
discretion (such as accented Latin letters, Greek letters, or Chinese
ideograms). This may be done with an extended character set, or the
‘<samp><span class="samp">\u</span></samp>’ and ‘<samp><span class="samp">\U</span></samp>’ escape sequences. The implementation of this
feature in GCC is experimental; such characters are only accepted in
the ‘<samp><span class="samp">\u</span></samp>’ and ‘<samp><span class="samp">\U</span></samp>’ forms and only if
<samp><span class="option">-fextended-identifiers</span></samp> is used.
<p>As an extension, GCC treats ‘<samp><span class="samp">$</span></samp>’ as a letter. This is for
compatibility with some systems, such as VMS, where ‘<samp><span class="samp">$</span></samp>’ is commonly
used in system-defined function and object names. ‘<samp><span class="samp">$</span></samp>’ is not a
letter in strictly conforming mode, or if you specify the <samp><span class="option">-$</span></samp>
option. See <a href="#Invocation">Invocation</a>.
<p><a name="index-numbers-11"></a><a name="index-preprocessing-numbers-12"></a>A <dfn>preprocessing number</dfn> has a rather bizarre definition. The
category includes all the normal integer and floating point constants
one expects of C, but also a number of other things one might not
initially recognize as a number. Formally, preprocessing numbers begin
with an optional period, a required decimal digit, and then continue
with any sequence of letters, digits, underscores, periods, and
exponents. Exponents are the two-character sequences ‘<samp><span class="samp">e+</span></samp>’,
‘<samp><span class="samp">e-</span></samp>’, ‘<samp><span class="samp">E+</span></samp>’, ‘<samp><span class="samp">E-</span></samp>’, ‘<samp><span class="samp">p+</span></samp>’, ‘<samp><span class="samp">p-</span></samp>’, ‘<samp><span class="samp">P+</span></samp>’, and
‘<samp><span class="samp">P-</span></samp>’. (The exponents that begin with ‘<samp><span class="samp">p</span></samp>’ or ‘<samp><span class="samp">P</span></samp>’ are new
to C99. They are used for hexadecimal floating-point constants.)
<p>The purpose of this unusual definition is to isolate the preprocessor
from the full complexity of numeric constants. It does not have to
distinguish between lexically valid and invalid floating-point numbers,
which is complicated. The definition also permits you to split an
identifier at any position and get exactly two tokens, which can then be
pasted back together with the ‘<samp><span class="samp">##</span></samp>’ operator.
<p>It's possible for preprocessing numbers to cause programs to be
misinterpreted. For example, <code>0xE+12</code> is a preprocessing number
which does not translate to any valid numeric constant, therefore a
syntax error. It does not mean <code>0xE + 12<!-- /@w --></code>, which is what you
might have intended.
<p><a name="index-string-literals-13"></a><a name="index-string-constants-14"></a><a name="index-character-constants-15"></a><a name="index-header-file-names-16"></a><!-- the @: prevents makeinfo from turning '' into ". -->
<dfn>String literals</dfn> are string constants, character constants, and
header file names (the argument of ‘<samp><span class="samp">#include</span></samp>’).<a rel="footnote" href="#fn-2" name="fnd-2"><sup>2</sup></a> String constants and character
constants are straightforward: <tt>"<small class="dots">...</small>"</tt> or <tt>'<small class="dots">...</small>'</tt>. In
either case embedded quotes should be escaped with a backslash:
<tt>'\''</tt> is the character constant for ‘<samp><span class="samp">'</span></samp>’. There is no limit on
the length of a character constant, but the value of a character
constant that contains more than one character is
implementation-defined. See <a href="#Implementation-Details">Implementation Details</a>.
<p>Header file names either look like string constants, <tt>"<small class="dots">...</small>"</tt>, or are
written with angle brackets instead, <tt><<small class="dots">...</small>></tt>. In either case,
backslash is an ordinary character. There is no way to escape the
closing quote or angle bracket. The preprocessor looks for the header
file in different places depending on which form you use. See <a href="#Include-Operation">Include Operation</a>.
<p>No string literal may extend past the end of a line. Older versions
of GCC accepted multi-line string constants. You may use continued
lines instead, or string constant concatenation. See <a href="#Differences-from-previous-versions">Differences from previous versions</a>.
<p><a name="index-punctuators-17"></a><a name="index-digraphs-18"></a><a name="index-alternative-tokens-19"></a><dfn>Punctuators</dfn> are all the usual bits of punctuation which are
meaningful to C and C++. All but three of the punctuation characters in
ASCII are C punctuators. The exceptions are ‘<samp><span class="samp">@</span></samp>’, ‘<samp><span class="samp">$</span></samp>’, and
‘<samp><span class="samp">`</span></samp>’. In addition, all the two- and three-character operators are
punctuators. There are also six <dfn>digraphs</dfn>, which the C++ standard
calls <dfn>alternative tokens</dfn>, which are merely alternate ways to spell
other punctuators. This is a second attempt to work around missing
punctuation in obsolete systems. It has no negative side effects,
unlike trigraphs, but does not cover as much ground. The digraphs and
their corresponding normal punctuators are:
<pre class="smallexample"> Digraph: <% %> <: :> %: %:%:
Punctuator: { } [ ] # ##
</pre>
<p><a name="index-other-tokens-20"></a>Any other single character is considered “other”. It is passed on to
the preprocessor's output unmolested. The C compiler will almost
certainly reject source code containing “other” tokens. In ASCII, the
only other characters are ‘<samp><span class="samp">@</span></samp>’, ‘<samp><span class="samp">$</span></samp>’, ‘<samp><span class="samp">`</span></samp>’, and control
characters other than NUL (all bits zero). (Note that ‘<samp><span class="samp">$</span></samp>’ is
normally considered a letter.) All characters with the high bit set
(numeric range 0x7F–0xFF) are also “other” in the present
implementation. This will change when proper support for international
character sets is added to GCC.
<p>NUL is a special case because of the high probability that its
appearance is accidental, and because it may be invisible to the user
(many terminals do not display NUL at all). Within comments, NULs are
silently ignored, just as any other character would be. In running
text, NUL is considered white space. For example, these two directives
have the same meaning.
<pre class="smallexample"> #define X^@1
#define X 1
</pre>
<p class="noindent">(where ‘<samp><span class="samp">^@</span></samp>’ is ASCII NUL). Within string or character constants,
NULs are preserved. In the latter two cases the preprocessor emits a
warning message.
<div class="node">
<a name="The-preprocessing-language"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#Tokenization">Tokenization</a>,
Up: <a rel="up" accesskey="u" href="#Overview">Overview</a>
</div>
<h3 class="section">1.4 The preprocessing language</h3>
<p><a name="index-directives-21"></a><a name="index-preprocessing-directives-22"></a><a name="index-directive-line-23"></a><a name="index-directive-name-24"></a>
After tokenization, the stream of tokens may simply be passed straight
to the compiler's parser. However, if it contains any operations in the
<dfn>preprocessing language</dfn>, it will be transformed first. This stage
corresponds roughly to the standard's “translation phase 4” and is
what most people think of as the preprocessor's job.
<p>The preprocessing language consists of <dfn>directives</dfn> to be executed
and <dfn>macros</dfn> to be expanded. Its primary capabilities are:
<ul>
<li>Inclusion of header files. These are files of declarations that can be
substituted into your program.
<li>Macro expansion. You can define <dfn>macros</dfn>, which are abbreviations
for arbitrary fragments of C code. The preprocessor will replace the
macros with their definitions throughout the program. Some macros are
automatically defined for you.
<li>Conditional compilation. You can include or exclude parts of the
program according to various conditions.
<li>Line control. If you use a program to combine or rearrange source files
into an intermediate file which is then compiled, you can use line
control to inform the compiler where each source line originally came
from.
<li>Diagnostics. You can detect problems at compile time and issue errors
or warnings.
</ul>
<p>There are a few more, less useful, features.
<p>Except for expansion of predefined macros, all these operations are
triggered with <dfn>preprocessing directives</dfn>. Preprocessing directives
are lines in your program that start with ‘<samp><span class="samp">#</span></samp>’. Whitespace is
allowed before and after the ‘<samp><span class="samp">#</span></samp>’. The ‘<samp><span class="samp">#</span></samp>’ is followed by an
identifier, the <dfn>directive name</dfn>. It specifies the operation to
perform. Directives are commonly referred to as ‘<samp><span class="samp">#</span><var>name</var></samp>’
where <var>name</var> is the directive name. For example, ‘<samp><span class="samp">#define</span></samp>’ is
the directive that defines a macro.
<p>The ‘<samp><span class="samp">#</span></samp>’ which begins a directive cannot come from a macro
expansion. Also, the directive name is not macro expanded. Thus, if
<code>foo</code> is defined as a macro expanding to <code>define</code>, that does
not make ‘<samp><span class="samp">#foo</span></samp>’ a valid preprocessing directive.
<p>The set of valid directive names is fixed. Programs cannot define new
preprocessing directives.
<p>Some directives require arguments; these make up the rest of the
directive line and must be separated from the directive name by
whitespace. For example, ‘<samp><span class="samp">#define</span></samp>’ must be followed by a macro
name and the intended expansion of the macro.
<p>A preprocessing directive cannot cover more than one line. The line
may, however, be continued with backslash-newline, or by a block comment
which extends past the end of the line. In either case, when the
directive is processed, the continuations have already been merged with
the first line to make one long line.
<div class="node">
<a name="Header-Files"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Macros">Macros</a>,
Previous: <a rel="previous" accesskey="p" href="#Overview">Overview</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">2 Header Files</h2>
<p><a name="index-header-file-25"></a>A header file is a file containing C declarations and macro definitions
(see <a href="#Macros">Macros</a>) to be shared between several source files. You request
the use of a header file in your program by <dfn>including</dfn> it, with the
C preprocessing directive ‘<samp><span class="samp">#include</span></samp>’.
<p>Header files serve two purposes.
<ul>
<li><a name="index-system-header-files-26"></a>System header files declare the interfaces to parts of the operating
system. You include them in your program to supply the definitions and
declarations you need to invoke system calls and libraries.
<li>Your own header files contain declarations for interfaces between the
source files of your program. Each time you have a group of related
declarations and macro definitions all or most of which are needed in
several different source files, it is a good idea to create a header
file for them.
</ul>
<p>Including a header file produces the same results as copying the header
file into each source file that needs it. Such copying would be
time-consuming and error-prone. With a header file, the related
declarations appear in only one place. If they need to be changed, they
can be changed in one place, and programs that include the header file
will automatically use the new version when next recompiled. The header
file eliminates the labor of finding and changing all the copies as well
as the risk that a failure to find one copy will result in
inconsistencies within a program.
<p>In C, the usual convention is to give header files names that end with
<samp><span class="file">.h</span></samp>. It is most portable to use only letters, digits, dashes, and
underscores in header file names, and at most one dot.
<ul class="menu">
<li><a accesskey="1" href="#Include-Syntax">Include Syntax</a>
<li><a accesskey="2" href="#Include-Operation">Include Operation</a>
<li><a accesskey="3" href="#Search-Path">Search Path</a>
<li><a accesskey="4" href="#Once_002dOnly-Headers">Once-Only Headers</a>
<li><a accesskey="5" href="#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a>
<li><a accesskey="6" href="#Computed-Includes">Computed Includes</a>
<li><a accesskey="7" href="#Wrapper-Headers">Wrapper Headers</a>
<li><a accesskey="8" href="#System-Headers">System Headers</a>
</ul>
<div class="node">
<a name="Include-Syntax"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Include-Operation">Include Operation</a>,
Up: <a rel="up" accesskey="u" href="#Header-Files">Header Files</a>
</div>
<h3 class="section">2.1 Include Syntax</h3>
<p><a name="index-g_t_0023include-27"></a>Both user and system header files are included using the preprocessing
directive ‘<samp><span class="samp">#include</span></samp>’. It has two variants:
<dl>
<dt><code>#include <</code><var>file</var><code>></code><dd>This variant is used for system header files. It searches for a file
named <var>file</var> in a standard list of system directories. You can prepend
directories to this list with the <samp><span class="option">-I</span></samp> option (see <a href="#Invocation">Invocation</a>).
<br><dt><code>#include "</code><var>file</var><code>"</code><dd>This variant is used for header files of your own program. It
searches for a file named <var>file</var> first in the directory containing
the current file, then in the quote directories and then the same
directories used for <code><</code><var>file</var><code>></code>. You can prepend directories
to the list of quote directories with the <samp><span class="option">-iquote</span></samp> option.
</dl>
<p>The argument of ‘<samp><span class="samp">#include</span></samp>’, whether delimited with quote marks or
angle brackets, behaves like a string constant in that comments are not
recognized, and macro names are not expanded. Thus, <code>#include <x/*y><!-- /@w --></code> specifies inclusion of a system header file named <samp><span class="file">x/*y</span></samp>.
<p>However, if backslashes occur within <var>file</var>, they are considered
ordinary text characters, not escape characters. None of the character
escape sequences appropriate to string constants in C are processed.
Thus, <code>#include "x\n\\y"<!-- /@w --></code> specifies a filename containing three
backslashes. (Some systems interpret ‘<samp><span class="samp">\</span></samp>’ as a pathname separator.
All of these also interpret ‘<samp><span class="samp">/</span></samp>’ the same way. It is most portable
to use only ‘<samp><span class="samp">/</span></samp>’.)
<p>It is an error if there is anything (other than comments) on the line
after the file name.
<div class="node">
<a name="Include-Operation"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Search-Path">Search Path</a>,
Previous: <a rel="previous" accesskey="p" href="#Include-Syntax">Include Syntax</a>,
Up: <a rel="up" accesskey="u" href="#Header-Files">Header Files</a>
</div>
<h3 class="section">2.2 Include Operation</h3>
<p>The ‘<samp><span class="samp">#include</span></samp>’ directive works by directing the C preprocessor to
scan the specified file as input before continuing with the rest of the
current file. The output from the preprocessor contains the output
already generated, followed by the output resulting from the included
file, followed by the output that comes from the text after the
‘<samp><span class="samp">#include</span></samp>’ directive. For example, if you have a header file
<samp><span class="file">header.h</span></samp> as follows,
<pre class="smallexample"> char *test (void);
</pre>
<p class="noindent">and a main program called <samp><span class="file">program.c</span></samp> that uses the header file,
like this,
<pre class="smallexample"> int x;
#include "header.h"
int
main (void)
{
puts (test ());
}
</pre>
<p class="noindent">the compiler will see the same token stream as it would if
<samp><span class="file">program.c</span></samp> read
<pre class="smallexample"> int x;
char *test (void);
int
main (void)
{
puts (test ());
}
</pre>
<p>Included files are not limited to declarations and macro definitions;
those are merely the typical uses. Any fragment of a C program can be
included from another file. The include file could even contain the
beginning of a statement that is concluded in the containing file, or
the end of a statement that was started in the including file. However,
an included file must consist of complete tokens. Comments and string
literals which have not been closed by the end of an included file are
invalid. For error recovery, they are considered to end at the end of
the file.
<p>To avoid confusion, it is best if header files contain only complete
syntactic units—function declarations or definitions, type
declarations, etc.
<p>The line following the ‘<samp><span class="samp">#include</span></samp>’ directive is always treated as a
separate line by the C preprocessor, even if the included file lacks a
final newline.
<div class="node">
<a name="Search-Path"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Once_002dOnly-Headers">Once-Only Headers</a>,
Previous: <a rel="previous" accesskey="p" href="#Include-Operation">Include Operation</a>,
Up: <a rel="up" accesskey="u" href="#Header-Files">Header Files</a>
</div>
<h3 class="section">2.3 Search Path</h3>
<p>GCC looks in several different places for headers. On a normal Unix
system, if you do not instruct it otherwise, it will look for headers
requested with <code>#include <</code><var>file</var><code>><!-- /@w --></code> in:
<pre class="smallexample"> /usr/local/include
<var>libdir</var>/gcc/<var>target</var>/<var>version</var>/include
/usr/<var>target</var>/include
/usr/include
</pre>
<p>For C++ programs, it will also look in <samp><span class="file">/usr/include/g++-v3</span></samp>,
first. In the above, <var>target</var> is the canonical name of the system
GCC was configured to compile code for; often but not always the same as
the canonical name of the system it runs on. <var>version</var> is the
version of GCC in use.
<p>You can add to this list with the <samp><span class="option">-I</span><var>dir</var></samp> command line
option. All the directories named by <samp><span class="option">-I</span></samp> are searched, in
left-to-right order, <em>before</em> the default directories. The only
exception is when <samp><span class="file">dir</span></samp> is already searched by default. In
this case, the option is ignored and the search order for system
directories remains unchanged.
<p>Duplicate directories are removed from the quote and bracket search
chains before the two chains are merged to make the final search chain.
Thus, it is possible for a directory to occur twice in the final search
chain if it was specified in both the quote and bracket chains.
<p>You can prevent GCC from searching any of the default directories with
the <samp><span class="option">-nostdinc</span></samp> option. This is useful when you are compiling an
operating system kernel or some other program that does not use the
standard C library facilities, or the standard C library itself.
<samp><span class="option">-I</span></samp> options are not ignored as described above when
<samp><span class="option">-nostdinc</span></samp> is in effect.
<p>GCC looks for headers requested with <code>#include "</code><var>file</var><code>"<!-- /@w --></code>
first in the directory containing the current file, then in the
directories as specified by <samp><span class="option">-iquote</span></samp> options, then in the same
places it would have looked for a header requested with angle
brackets. For example, if <samp><span class="file">/usr/include/sys/stat.h</span></samp> contains
<code>#include "types.h"<!-- /@w --></code>, GCC looks for <samp><span class="file">types.h</span></samp> first in
<samp><span class="file">/usr/include/sys</span></samp>, then in its usual search path.
<p>‘<samp><span class="samp">#line</span></samp>’ (see <a href="#Line-Control">Line Control</a>) does not change GCC's idea of the
directory containing the current file.
<p>You may put <samp><span class="option">-I-</span></samp> at any point in your list of <samp><span class="option">-I</span></samp> options.
This has two effects. First, directories appearing before the
<samp><span class="option">-I-</span></samp> in the list are searched only for headers requested with
quote marks. Directories after <samp><span class="option">-I-</span></samp> are searched for all
headers. Second, the directory containing the current file is not
searched for anything, unless it happens to be one of the directories
named by an <samp><span class="option">-I</span></samp> switch. <samp><span class="option">-I-</span></samp> is deprecated, <samp><span class="option">-iquote</span></samp>
should be used instead.
<p><samp><span class="option">-I. -I-</span></samp> is not the same as no <samp><span class="option">-I</span></samp> options at all, and does
not cause the same behavior for ‘<samp><span class="samp"><></span></samp>’ includes that ‘<samp><span class="samp">""</span></samp>’
includes get with no special options. <samp><span class="option">-I.</span></samp> searches the
compiler's current working directory for header files. That may or may
not be the same as the directory containing the current file.
<p>If you need to look for headers in a directory named <samp><span class="file">-</span></samp>, write
<samp><span class="option">-I./-</span></samp>.
<p>There are several more ways to adjust the header search path. They are
generally less useful. See <a href="#Invocation">Invocation</a>.
<div class="node">
<a name="Once-Only-Headers"></a>
<a name="Once_002dOnly-Headers"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a>,
Previous: <a rel="previous" accesskey="p" href="#Search-Path">Search Path</a>,
Up: <a rel="up" accesskey="u" href="#Header-Files">Header Files</a>
</div>
<h3 class="section">2.4 Once-Only Headers</h3>
<p><a name="index-repeated-inclusion-28"></a><a name="index-including-just-once-29"></a><a name="index-wrapper-_0040code_007b_0023ifndef_007d-30"></a>
If a header file happens to be included twice, the compiler will process
its contents twice. This is very likely to cause an error, e.g. when the
compiler sees the same structure definition twice. Even if it does not,
it will certainly waste time.
<p>The standard way to prevent this is to enclose the entire real contents
of the file in a conditional, like this:
<pre class="smallexample"> /* File foo. */
#ifndef FILE_FOO_SEEN
#define FILE_FOO_SEEN
<var>the entire file</var>
#endif /* !FILE_FOO_SEEN */
</pre>
<p>This construct is commonly known as a <dfn>wrapper #ifndef</dfn>.
When the header is included again, the conditional will be false,
because <code>FILE_FOO_SEEN</code> is defined. The preprocessor will skip
over the entire contents of the file, and the compiler will not see it
twice.
<p>CPP optimizes even further. It remembers when a header file has a
wrapper ‘<samp><span class="samp">#ifndef</span></samp>’. If a subsequent ‘<samp><span class="samp">#include</span></samp>’ specifies that
header, and the macro in the ‘<samp><span class="samp">#ifndef</span></samp>’ is still defined, it does
not bother to rescan the file at all.
<p>You can put comments outside the wrapper. They will not interfere with
this optimization.
<p><a name="index-controlling-macro-31"></a><a name="index-guard-macro-32"></a>The macro <code>FILE_FOO_SEEN</code> is called the <dfn>controlling macro</dfn> or
<dfn>guard macro</dfn>. In a user header file, the macro name should not
begin with ‘<samp><span class="samp">_</span></samp>’. In a system header file, it should begin with
‘<samp><span class="samp">__</span></samp>’ to avoid conflicts with user programs. In any kind of header
file, the macro name should contain the name of the file and some
additional text, to avoid conflicts with other header files.
<div class="node">
<a name="Alternatives-to-Wrapper-%23ifndef"></a>
<a name="Alternatives-to-Wrapper-_0023ifndef"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Computed-Includes">Computed Includes</a>,
Previous: <a rel="previous" accesskey="p" href="#Once_002dOnly-Headers">Once-Only Headers</a>,
Up: <a rel="up" accesskey="u" href="#Header-Files">Header Files</a>
</div>
<h3 class="section">2.5 Alternatives to Wrapper #ifndef</h3>
<p>CPP supports two more ways of indicating that a header file should be
read only once. Neither one is as portable as a wrapper ‘<samp><span class="samp">#ifndef</span></samp>’
and we recommend you do not use them in new programs, with the caveat
that ‘<samp><span class="samp">#import</span></samp>’ is standard practice in Objective-C.
<p><a name="index-g_t_0023import-33"></a>CPP supports a variant of ‘<samp><span class="samp">#include</span></samp>’ called ‘<samp><span class="samp">#import</span></samp>’ which
includes a file, but does so at most once. If you use ‘<samp><span class="samp">#import</span></samp>’
instead of ‘<samp><span class="samp">#include</span></samp>’, then you don't need the conditionals
inside the header file to prevent multiple inclusion of the contents.
‘<samp><span class="samp">#import</span></samp>’ is standard in Objective-C, but is considered a
deprecated extension in C and C++.
<p>‘<samp><span class="samp">#import</span></samp>’ is not a well designed feature. It requires the users of
a header file to know that it should only be included once. It is much
better for the header file's implementor to write the file so that users
don't need to know this. Using a wrapper ‘<samp><span class="samp">#ifndef</span></samp>’ accomplishes
this goal.
<p>In the present implementation, a single use of ‘<samp><span class="samp">#import</span></samp>’ will
prevent the file from ever being read again, by either ‘<samp><span class="samp">#import</span></samp>’ or
‘<samp><span class="samp">#include</span></samp>’. You should not rely on this; do not use both
‘<samp><span class="samp">#import</span></samp>’ and ‘<samp><span class="samp">#include</span></samp>’ to refer to the same header file.
<p>Another way to prevent a header file from being included more than once
is with the ‘<samp><span class="samp">#pragma once</span></samp>’ directive. If ‘<samp><span class="samp">#pragma once</span></samp>’ is
seen when scanning a header file, that file will never be read again, no
matter what.
<p>‘<samp><span class="samp">#pragma once</span></samp>’ does not have the problems that ‘<samp><span class="samp">#import</span></samp>’ does,
but it is not recognized by all preprocessors, so you cannot rely on it
in a portable program.
<div class="node">
<a name="Computed-Includes"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Wrapper-Headers">Wrapper Headers</a>,
Previous: <a rel="previous" accesskey="p" href="#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a>,
Up: <a rel="up" accesskey="u" href="#Header-Files">Header Files</a>
</div>
<h3 class="section">2.6 Computed Includes</h3>
<p><a name="index-computed-includes-34"></a><a name="index-macros-in-include-35"></a>
Sometimes it is necessary to select one of several different header
files to be included into your program. They might specify
configuration parameters to be used on different sorts of operating
systems, for instance. You could do this with a series of conditionals,
<pre class="smallexample"> #if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif
</pre>
<p>That rapidly becomes tedious. Instead, the preprocessor offers the
ability to use a macro for the header name. This is called a
<dfn>computed include</dfn>. Instead of writing a header name as the direct
argument of ‘<samp><span class="samp">#include</span></samp>’, you simply put a macro name there instead:
<pre class="smallexample"> #define SYSTEM_H "system_1.h"
...
#include SYSTEM_H
</pre>
<p class="noindent"><code>SYSTEM_H</code> will be expanded, and the preprocessor will look for
<samp><span class="file">system_1.h</span></samp> as if the ‘<samp><span class="samp">#include</span></samp>’ had been written that way
originally. <code>SYSTEM_H</code> could be defined by your Makefile with a
<samp><span class="option">-D</span></samp> option.
<p>You must be careful when you define the macro. ‘<samp><span class="samp">#define</span></samp>’ saves
tokens, not text. The preprocessor has no way of knowing that the macro
will be used as the argument of ‘<samp><span class="samp">#include</span></samp>’, so it generates
ordinary tokens, not a header name. This is unlikely to cause problems
if you use double-quote includes, which are close enough to string
constants. If you use angle brackets, however, you may have trouble.
<p>The syntax of a computed include is actually a bit more general than the
above. If the first non-whitespace character after ‘<samp><span class="samp">#include</span></samp>’ is
not ‘<samp><span class="samp">"</span></samp>’ or ‘<samp><span class="samp"><</span></samp>’, then the entire line is macro-expanded
like running text would be.
<p>If the line expands to a single string constant, the contents of that
string constant are the file to be included. CPP does not re-examine the
string for embedded quotes, but neither does it process backslash
escapes in the string. Therefore
<pre class="smallexample"> #define HEADER "a\"b"
#include HEADER
</pre>
<p class="noindent">looks for a file named <samp><span class="file">a\"b</span></samp>. CPP searches for the file according
to the rules for double-quoted includes.
<p>If the line expands to a token stream beginning with a ‘<samp><span class="samp"><</span></samp>’ token
and including a ‘<samp><span class="samp">></span></samp>’ token, then the tokens between the ‘<samp><span class="samp"><</span></samp>’ and
the first ‘<samp><span class="samp">></span></samp>’ are combined to form the filename to be included.
Any whitespace between tokens is reduced to a single space; then any
space after the initial ‘<samp><span class="samp"><</span></samp>’ is retained, but a trailing space
before the closing ‘<samp><span class="samp">></span></samp>’ is ignored. CPP searches for the file
according to the rules for angle-bracket includes.
<p>In either case, if there are any tokens on the line after the file name,
an error occurs and the directive is not processed. It is also an error
if the result of expansion does not match either of the two expected
forms.
<p>These rules are implementation-defined behavior according to the C
standard. To minimize the risk of different compilers interpreting your
computed includes differently, we recommend you use only a single
object-like macro which expands to a string constant. This will also
minimize confusion for people reading your program.
<div class="node">
<a name="Wrapper-Headers"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#System-Headers">System Headers</a>,
Previous: <a rel="previous" accesskey="p" href="#Computed-Includes">Computed Includes</a>,
Up: <a rel="up" accesskey="u" href="#Header-Files">Header Files</a>
</div>
<h3 class="section">2.7 Wrapper Headers</h3>
<p><a name="index-wrapper-headers-36"></a><a name="index-overriding-a-header-file-37"></a><a name="index-g_t_0023include_005fnext-38"></a>
Sometimes it is necessary to adjust the contents of a system-provided
header file without editing it directly. GCC's <samp><span class="command">fixincludes</span></samp>
operation does this, for example. One way to do that would be to create
a new header file with the same name and insert it in the search path
before the original header. That works fine as long as you're willing
to replace the old header entirely. But what if you want to refer to
the old header from the new one?
<p>You cannot simply include the old header with ‘<samp><span class="samp">#include</span></samp>’. That
will start from the beginning, and find your new header again. If your
header is not protected from multiple inclusion (see <a href="#Once_002dOnly-Headers">Once-Only Headers</a>), it will recurse infinitely and cause a fatal error.
<p>You could include the old header with an absolute pathname:
<pre class="smallexample"> #include "/usr/include/old-header.h"
</pre>
<p class="noindent">This works, but is not clean; should the system headers ever move, you
would have to edit the new headers to match.
<p>There is no way to solve this problem within the C standard, but you can
use the GNU extension ‘<samp><span class="samp">#include_next</span></samp>’. It means, “Include the
<em>next</em> file with this name”. This directive works like
‘<samp><span class="samp">#include</span></samp>’ except in searching for the specified file: it starts
searching the list of header file directories <em>after</em> the directory
in which the current file was found.
<p>Suppose you specify <samp><span class="option">-I /usr/local/include</span></samp>, and the list of
directories to search also includes <samp><span class="file">/usr/include</span></samp>; and suppose
both directories contain <samp><span class="file">signal.h</span></samp>. Ordinary <code>#include <signal.h><!-- /@w --></code> finds the file under <samp><span class="file">/usr/local/include</span></samp>. If that
file contains <code>#include_next <signal.h><!-- /@w --></code>, it starts searching
after that directory, and finds the file in <samp><span class="file">/usr/include</span></samp>.
<p>‘<samp><span class="samp">#include_next</span></samp>’ does not distinguish between <code><</code><var>file</var><code>></code>
and <code>"</code><var>file</var><code>"</code> inclusion, nor does it check that the file you
specify has the same name as the current file. It simply looks for the
file named, starting with the directory in the search path after the one
where the current file was found.
<p>The use of ‘<samp><span class="samp">#include_next</span></samp>’ can lead to great confusion. We
recommend it be used only when there is no other alternative. In
particular, it should not be used in the headers belonging to a specific
program; it should be used only to make global corrections along the
lines of <samp><span class="command">fixincludes</span></samp>.
<div class="node">
<a name="System-Headers"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#Wrapper-Headers">Wrapper Headers</a>,
Up: <a rel="up" accesskey="u" href="#Header-Files">Header Files</a>
</div>
<h3 class="section">2.8 System Headers</h3>
<p><a name="index-system-header-files-39"></a>
The header files declaring interfaces to the operating system and
runtime libraries often cannot be written in strictly conforming C.
Therefore, GCC gives code found in <dfn>system headers</dfn> special
treatment. All warnings, other than those generated by ‘<samp><span class="samp">#warning</span></samp>’
(see <a href="#Diagnostics">Diagnostics</a>), are suppressed while GCC is processing a system
header. Macros defined in a system header are immune to a few warnings
wherever they are expanded. This immunity is granted on an ad-hoc
basis, when we find that a warning generates lots of false positives
because of code in macros defined in system headers.
<p>Normally, only the headers found in specific directories are considered
system headers. These directories are determined when GCC is compiled.
There are, however, two ways to make normal headers into system headers.
<p>The <samp><span class="option">-isystem</span></samp> command line option adds its argument to the list of
directories to search for headers, just like <samp><span class="option">-I</span></samp>. Any headers
found in that directory will be considered system headers.
<p>All directories named by <samp><span class="option">-isystem</span></samp> are searched <em>after</em> all
directories named by <samp><span class="option">-I</span></samp>, no matter what their order was on the
command line. If the same directory is named by both <samp><span class="option">-I</span></samp> and
<samp><span class="option">-isystem</span></samp>, the <samp><span class="option">-I</span></samp> option is ignored. GCC provides an
informative message when this occurs if <samp><span class="option">-v</span></samp> is used.
<p><a name="index-g_t_0023pragma-GCC-system_005fheader-40"></a>There is also a directive, <code>#pragma GCC system_header<!-- /@w --></code>, which
tells GCC to consider the rest of the current include file a system
header, no matter where it was found. Code that comes before the
‘<samp><span class="samp">#pragma</span></samp>’ in the file will not be affected. <code>#pragma GCC system_header<!-- /@w --></code> has no effect in the primary source file.
<p>On very old systems, some of the pre-defined system header directories
get even more special treatment. GNU C++ considers code in headers
found in those directories to be surrounded by an <code>extern "C"<!-- /@w --></code>
block. There is no way to request this behavior with a ‘<samp><span class="samp">#pragma</span></samp>’,
or from the command line.
<div class="node">
<a name="Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Conditionals">Conditionals</a>,
Previous: <a rel="previous" accesskey="p" href="#Header-Files">Header Files</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">3 Macros</h2>
<p>A <dfn>macro</dfn> is a fragment of code which has been given a name.
Whenever the name is used, it is replaced by the contents of the macro.
There are two kinds of macros. They differ mostly in what they look
like when they are used. <dfn>Object-like</dfn> macros resemble data objects
when used, <dfn>function-like</dfn> macros resemble function calls.
<p>You may define any valid identifier as a macro, even if it is a C
keyword. The preprocessor does not know anything about keywords. This
can be useful if you wish to hide a keyword such as <code>const</code> from an
older compiler that does not understand it. However, the preprocessor
operator <code>defined</code> (see <a href="#Defined">Defined</a>) can never be defined as a
macro, and C++'s named operators (see <a href="#C_002b_002b-Named-Operators">C++ Named Operators</a>) cannot be
macros when you are compiling C++.
<ul class="menu">
<li><a accesskey="1" href="#Object_002dlike-Macros">Object-like Macros</a>
<li><a accesskey="2" href="#Function_002dlike-Macros">Function-like Macros</a>
<li><a accesskey="3" href="#Macro-Arguments">Macro Arguments</a>
<li><a accesskey="4" href="#Stringification">Stringification</a>
<li><a accesskey="5" href="#Concatenation">Concatenation</a>
<li><a accesskey="6" href="#Variadic-Macros">Variadic Macros</a>
<li><a accesskey="7" href="#Predefined-Macros">Predefined Macros</a>
<li><a accesskey="8" href="#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a>
<li><a accesskey="9" href="#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a>
<li><a href="#Macro-Pitfalls">Macro Pitfalls</a>
</ul>
<div class="node">
<a name="Object-like-Macros"></a>
<a name="Object_002dlike-Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Function_002dlike-Macros">Function-like Macros</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.1 Object-like Macros</h3>
<p><a name="index-object_002dlike-macro-41"></a><a name="index-symbolic-constants-42"></a><a name="index-manifest-constants-43"></a>
An <dfn>object-like macro</dfn> is a simple identifier which will be replaced
by a code fragment. It is called object-like because it looks like a
data object in code that uses it. They are most commonly used to give
symbolic names to numeric constants.
<p><a name="index-g_t_0023define-44"></a>You create macros with the ‘<samp><span class="samp">#define</span></samp>’ directive. ‘<samp><span class="samp">#define</span></samp>’ is
followed by the name of the macro and then the token sequence it should
be an abbreviation for, which is variously referred to as the macro's
<dfn>body</dfn>, <dfn>expansion</dfn> or <dfn>replacement list</dfn>. For example,
<pre class="smallexample"> #define BUFFER_SIZE 1024
</pre>
<p class="noindent">defines a macro named <code>BUFFER_SIZE</code> as an abbreviation for the
token <code>1024</code>. If somewhere after this ‘<samp><span class="samp">#define</span></samp>’ directive
there comes a C statement of the form
<pre class="smallexample"> foo = (char *) malloc (BUFFER_SIZE);
</pre>
<p class="noindent">then the C preprocessor will recognize and <dfn>expand</dfn> the macro
<code>BUFFER_SIZE</code>. The C compiler will see the same tokens as it would
if you had written
<pre class="smallexample"> foo = (char *) malloc (1024);
</pre>
<p>By convention, macro names are written in uppercase. Programs are
easier to read when it is possible to tell at a glance which names are
macros.
<p>The macro's body ends at the end of the ‘<samp><span class="samp">#define</span></samp>’ line. You may
continue the definition onto multiple lines, if necessary, using
backslash-newline. When the macro is expanded, however, it will all
come out on one line. For example,
<pre class="smallexample"> #define NUMBERS 1, \
2, \
3
int x[] = { NUMBERS };
==> int x[] = { 1, 2, 3 };
</pre>
<p class="noindent">The most common visible consequence of this is surprising line numbers
in error messages.
<p>There is no restriction on what can go in a macro body provided it
decomposes into valid preprocessing tokens. Parentheses need not
balance, and the body need not resemble valid C code. (If it does not,
you may get error messages from the C compiler when you use the macro.)
<p>The C preprocessor scans your program sequentially. Macro definitions
take effect at the place you write them. Therefore, the following input
to the C preprocessor
<pre class="smallexample"> foo = X;
#define X 4
bar = X;
</pre>
<p class="noindent">produces
<pre class="smallexample"> foo = X;
bar = 4;
</pre>
<p>When the preprocessor expands a macro name, the macro's expansion
replaces the macro invocation, then the expansion is examined for more
macros to expand. For example,
<pre class="smallexample"> #define TABLESIZE BUFSIZE
#define BUFSIZE 1024
TABLESIZE
==> BUFSIZE
==> 1024
</pre>
<p class="noindent"><code>TABLESIZE</code> is expanded first to produce <code>BUFSIZE</code>, then that
macro is expanded to produce the final result, <code>1024</code>.
<p>Notice that <code>BUFSIZE</code> was not defined when <code>TABLESIZE</code> was
defined. The ‘<samp><span class="samp">#define</span></samp>’ for <code>TABLESIZE</code> uses exactly the
expansion you specify—in this case, <code>BUFSIZE</code>—and does not
check to see whether it too contains macro names. Only when you
<em>use</em> <code>TABLESIZE</code> is the result of its expansion scanned for
more macro names.
<p>This makes a difference if you change the definition of <code>BUFSIZE</code>
at some point in the source file. <code>TABLESIZE</code>, defined as shown,
will always expand using the definition of <code>BUFSIZE</code> that is
currently in effect:
<pre class="smallexample"> #define BUFSIZE 1020
#define TABLESIZE BUFSIZE
#undef BUFSIZE
#define BUFSIZE 37
</pre>
<p class="noindent">Now <code>TABLESIZE</code> expands (in two stages) to <code>37</code>.
<p>If the expansion of a macro contains its own name, either directly or
via intermediate macros, it is not expanded again when the expansion is
examined for more macros. This prevents infinite recursion.
See <a href="#Self_002dReferential-Macros">Self-Referential Macros</a>, for the precise details.
<div class="node">
<a name="Function-like-Macros"></a>
<a name="Function_002dlike-Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Macro-Arguments">Macro Arguments</a>,
Previous: <a rel="previous" accesskey="p" href="#Object_002dlike-Macros">Object-like Macros</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.2 Function-like Macros</h3>
<p><a name="index-function_002dlike-macros-45"></a>
You can also define macros whose use looks like a function call. These
are called <dfn>function-like macros</dfn>. To define a function-like macro,
you use the same ‘<samp><span class="samp">#define</span></samp>’ directive, but you put a pair of
parentheses immediately after the macro name. For example,
<pre class="smallexample"> #define lang_init() c_init()
lang_init()
==> c_init()
</pre>
<p>A function-like macro is only expanded if its name appears with a pair
of parentheses after it. If you write just the name, it is left alone.
This can be useful when you have a function and a macro of the same
name, and you wish to use the function sometimes.
<pre class="smallexample"> extern void foo(void);
#define foo() /* <span class="roman">optimized inline version</span> */
...
foo();
funcptr = foo;
</pre>
<p>Here the call to <code>foo()</code> will use the macro, but the function
pointer will get the address of the real function. If the macro were to
be expanded, it would cause a syntax error.
<p>If you put spaces between the macro name and the parentheses in the
macro definition, that does not define a function-like macro, it defines
an object-like macro whose expansion happens to begin with a pair of
parentheses.
<pre class="smallexample"> #define lang_init () c_init()
lang_init()
==> () c_init()()
</pre>
<p>The first two pairs of parentheses in this expansion come from the
macro. The third is the pair that was originally after the macro
invocation. Since <code>lang_init</code> is an object-like macro, it does not
consume those parentheses.
<div class="node">
<a name="Macro-Arguments"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Stringification">Stringification</a>,
Previous: <a rel="previous" accesskey="p" href="#Function_002dlike-Macros">Function-like Macros</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.3 Macro Arguments</h3>
<p><a name="index-arguments-46"></a><a name="index-macros-with-arguments-47"></a><a name="index-arguments-in-macro-definitions-48"></a>
Function-like macros can take <dfn>arguments</dfn>, just like true functions.
To define a macro that uses arguments, you insert <dfn>parameters</dfn>
between the pair of parentheses in the macro definition that make the
macro function-like. The parameters must be valid C identifiers,
separated by commas and optionally whitespace.
<p>To invoke a macro that takes arguments, you write the name of the macro
followed by a list of <dfn>actual arguments</dfn> in parentheses, separated
by commas. The invocation of the macro need not be restricted to a
single logical line—it can cross as many lines in the source file as
you wish. The number of arguments you give must match the number of
parameters in the macro definition. When the macro is expanded, each
use of a parameter in its body is replaced by the tokens of the
corresponding argument. (You need not use all of the parameters in the
macro body.)
<p>As an example, here is a macro that computes the minimum of two numeric
values, as it is defined in many C programs, and some uses.
<pre class="smallexample"> #define min(X, Y) ((X) < (Y) ? (X) : (Y))
x = min(a, b); ==> x = ((a) < (b) ? (a) : (b));
y = min(1, 2); ==> y = ((1) < (2) ? (1) : (2));
z = min(a + 28, *p); ==> z = ((a + 28) < (*p) ? (a + 28) : (*p));
</pre>
<p class="noindent">(In this small example you can already see several of the dangers of
macro arguments. See <a href="#Macro-Pitfalls">Macro Pitfalls</a>, for detailed explanations.)
<p>Leading and trailing whitespace in each argument is dropped, and all
whitespace between the tokens of an argument is reduced to a single
space. Parentheses within each argument must balance; a comma within
such parentheses does not end the argument. However, there is no
requirement for square brackets or braces to balance, and they do not
prevent a comma from separating arguments. Thus,
<pre class="smallexample"> macro (array[x = y, x + 1])
</pre>
<p class="noindent">passes two arguments to <code>macro</code>: <code>array[x = y</code> and <code>x +
1]</code>. If you want to supply <code>array[x = y, x + 1]</code> as an argument,
you can write it as <code>array[(x = y, x + 1)]</code>, which is equivalent C
code.
<p>All arguments to a macro are completely macro-expanded before they are
substituted into the macro body. After substitution, the complete text
is scanned again for macros to expand, including the arguments. This rule
may seem strange, but it is carefully designed so you need not worry
about whether any function call is actually a macro invocation. You can
run into trouble if you try to be too clever, though. See <a href="#Argument-Prescan">Argument Prescan</a>, for detailed discussion.
<p>For example, <code>min (min (a, b), c)</code> is first expanded to
<pre class="smallexample"> min (((a) < (b) ? (a) : (b)), (c))
</pre>
<p class="noindent">and then to
<pre class="smallexample"> ((((a) < (b) ? (a) : (b))) < (c)
? (((a) < (b) ? (a) : (b)))
: (c))
</pre>
<p class="noindent">(Line breaks shown here for clarity would not actually be generated.)
<p><a name="index-empty-macro-arguments-49"></a>You can leave macro arguments empty; this is not an error to the
preprocessor (but many macros will then expand to invalid code).
You cannot leave out arguments entirely; if a macro takes two arguments,
there must be exactly one comma at the top level of its argument list.
Here are some silly examples using <code>min</code>:
<pre class="smallexample"> min(, b) ==> (( ) < (b) ? ( ) : (b))
min(a, ) ==> ((a ) < ( ) ? (a ) : ( ))
min(,) ==> (( ) < ( ) ? ( ) : ( ))
min((,),) ==> (((,)) < ( ) ? ((,)) : ( ))
min() error--> macro "min" requires 2 arguments, but only 1 given
min(,,) error--> macro "min" passed 3 arguments, but takes just 2
</pre>
<p>Whitespace is not a preprocessing token, so if a macro <code>foo</code> takes
one argument, <code>foo ()<!-- /@w --></code> and <code>foo ( )<!-- /@w --></code> both supply it an
empty argument. Previous GNU preprocessor implementations and
documentation were incorrect on this point, insisting that a
function-like macro that takes a single argument be passed a space if an
empty argument was required.
<p>Macro parameters appearing inside string literals are not replaced by
their corresponding actual arguments.
<pre class="smallexample"> #define foo(x) x, "x"
foo(bar) ==> bar, "x"
</pre>
<div class="node">
<a name="Stringification"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Concatenation">Concatenation</a>,
Previous: <a rel="previous" accesskey="p" href="#Macro-Arguments">Macro Arguments</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.4 Stringification</h3>
<p><a name="index-stringification-50"></a><a name="index-g_t_0040samp_007b_0023_007d-operator-51"></a>
Sometimes you may want to convert a macro argument into a string
constant. Parameters are not replaced inside string constants, but you
can use the ‘<samp><span class="samp">#</span></samp>’ preprocessing operator instead. When a macro
parameter is used with a leading ‘<samp><span class="samp">#</span></samp>’, the preprocessor replaces it
with the literal text of the actual argument, converted to a string
constant. Unlike normal parameter replacement, the argument is not
macro-expanded first. This is called <dfn>stringification</dfn>.
<p>There is no way to combine an argument with surrounding text and
stringify it all together. Instead, you can write a series of adjacent
string constants and stringified arguments. The preprocessor will
replace the stringified arguments with string constants. The C
compiler will then combine all the adjacent string constants into one
long string.
<p>Here is an example of a macro definition that uses stringification:
<pre class="smallexample"> #define WARN_IF(EXP) \
do { if (EXP) \
fprintf (stderr, "Warning: " #EXP "\n"); } \
while (0)
WARN_IF (x == 0);
==> do { if (x == 0)
fprintf (stderr, "Warning: " "x == 0" "\n"); } while (0);
</pre>
<p class="noindent">The argument for <code>EXP</code> is substituted once, as-is, into the
<code>if</code> statement, and once, stringified, into the argument to
<code>fprintf</code>. If <code>x</code> were a macro, it would be expanded in the
<code>if</code> statement, but not in the string.
<p>The <code>do</code> and <code>while (0)</code> are a kludge to make it possible to
write <code>WARN_IF (</code><var>arg</var><code>);</code>, which the resemblance of
<code>WARN_IF</code> to a function would make C programmers want to do; see
<a href="#Swallowing-the-Semicolon">Swallowing the Semicolon</a>.
<p>Stringification in C involves more than putting double-quote characters
around the fragment. The preprocessor backslash-escapes the quotes
surrounding embedded string constants, and all backslashes within string and
character constants, in order to get a valid C string constant with the
proper contents. Thus, stringifying <code>p = "foo\n";<!-- /@w --></code> results in
<tt>"p = \"foo\\n\";"<!-- /@w --></tt>. However, backslashes that are not inside string
or character constants are not duplicated: ‘<samp><span class="samp">\n</span></samp>’ by itself
stringifies to <tt>"\n"</tt>.
<p>All leading and trailing whitespace in text being stringified is
ignored. Any sequence of whitespace in the middle of the text is
converted to a single space in the stringified result. Comments are
replaced by whitespace long before stringification happens, so they
never appear in stringified text.
<p>There is no way to convert a macro argument into a character constant.
<p>If you want to stringify the result of expansion of a macro argument,
you have to use two levels of macros.
<pre class="smallexample"> #define xstr(s) str(s)
#define str(s) #s
#define foo 4
str (foo)
==> "foo"
xstr (foo)
==> xstr (4)
==> str (4)
==> "4"
</pre>
<p><code>s</code> is stringified when it is used in <code>str</code>, so it is not
macro-expanded first. But <code>s</code> is an ordinary argument to
<code>xstr</code>, so it is completely macro-expanded before <code>xstr</code>
itself is expanded (see <a href="#Argument-Prescan">Argument Prescan</a>). Therefore, by the time
<code>str</code> gets to its argument, it has already been macro-expanded.
<div class="node">
<a name="Concatenation"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Variadic-Macros">Variadic Macros</a>,
Previous: <a rel="previous" accesskey="p" href="#Stringification">Stringification</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.5 Concatenation</h3>
<p><a name="index-concatenation-52"></a><a name="index-token-pasting-53"></a><a name="index-token-concatenation-54"></a><a name="index-g_t_0040samp_007b_0023_0023_007d-operator-55"></a>
It is often useful to merge two tokens into one while expanding macros.
This is called <dfn>token pasting</dfn> or <dfn>token concatenation</dfn>. The
‘<samp><span class="samp">##</span></samp>’ preprocessing operator performs token pasting. When a macro
is expanded, the two tokens on either side of each ‘<samp><span class="samp">##</span></samp>’ operator
are combined into a single token, which then replaces the ‘<samp><span class="samp">##</span></samp>’ and
the two original tokens in the macro expansion. Usually both will be
identifiers, or one will be an identifier and the other a preprocessing
number. When pasted, they make a longer identifier. This isn't the
only valid case. It is also possible to concatenate two numbers (or a
number and a name, such as <code>1.5</code> and <code>e3</code>) into a number.
Also, multi-character operators such as <code>+=</code> can be formed by
token pasting.
<p>However, two tokens that don't together form a valid token cannot be
pasted together. For example, you cannot concatenate <code>x</code> with
<code>+</code> in either order. If you try, the preprocessor issues a warning
and emits the two tokens. Whether it puts white space between the
tokens is undefined. It is common to find unnecessary uses of ‘<samp><span class="samp">##</span></samp>’
in complex macros. If you get this warning, it is likely that you can
simply remove the ‘<samp><span class="samp">##</span></samp>’.
<p>Both the tokens combined by ‘<samp><span class="samp">##</span></samp>’ could come from the macro body,
but you could just as well write them as one token in the first place.
Token pasting is most useful when one or both of the tokens comes from a
macro argument. If either of the tokens next to an ‘<samp><span class="samp">##</span></samp>’ is a
parameter name, it is replaced by its actual argument before ‘<samp><span class="samp">##</span></samp>’
executes. As with stringification, the actual argument is not
macro-expanded first. If the argument is empty, that ‘<samp><span class="samp">##</span></samp>’ has no
effect.
<p>Keep in mind that the C preprocessor converts comments to whitespace
before macros are even considered. Therefore, you cannot create a
comment by concatenating ‘<samp><span class="samp">/</span></samp>’ and ‘<samp><span class="samp">*</span></samp>’. You can put as much
whitespace between ‘<samp><span class="samp">##</span></samp>’ and its operands as you like, including
comments, and you can put comments in arguments that will be
concatenated. However, it is an error if ‘<samp><span class="samp">##</span></samp>’ appears at either
end of a macro body.
<p>Consider a C program that interprets named commands. There probably
needs to be a table of commands, perhaps an array of structures declared
as follows:
<pre class="smallexample"> struct command
{
char *name;
void (*function) (void);
};
struct command commands[] =
{
{ "quit", quit_command },
{ "help", help_command },
...
};
</pre>
<p>It would be cleaner not to have to give each command name twice, once in
the string constant and once in the function name. A macro which takes the
name of a command as an argument can make this unnecessary. The string
constant can be created with stringification, and the function name by
concatenating the argument with ‘<samp><span class="samp">_command</span></samp>’. Here is how it is done:
<pre class="smallexample"> #define COMMAND(NAME) { #NAME, NAME ## _command }
struct command commands[] =
{
COMMAND (quit),
COMMAND (help),
...
};
</pre>
<div class="node">
<a name="Variadic-Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Predefined-Macros">Predefined Macros</a>,
Previous: <a rel="previous" accesskey="p" href="#Concatenation">Concatenation</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.6 Variadic Macros</h3>
<p><a name="index-variable-number-of-arguments-56"></a><a name="index-macros-with-variable-arguments-57"></a><a name="index-variadic-macros-58"></a>
A macro can be declared to accept a variable number of arguments much as
a function can. The syntax for defining the macro is similar to that of
a function. Here is an example:
<pre class="smallexample"> #define eprintf(...) fprintf (stderr, __VA_ARGS__)
</pre>
<p>This kind of macro is called <dfn>variadic</dfn>. When the macro is invoked,
all the tokens in its argument list after the last named argument (this
macro has none), including any commas, become the <dfn>variable
argument</dfn>. This sequence of tokens replaces the identifier
<code>__VA_ARGS__<!-- /@w --></code> in the macro body wherever it appears. Thus, we
have this expansion:
<pre class="smallexample"> eprintf ("%s:%d: ", input_file, lineno)
==> fprintf (stderr, "%s:%d: ", input_file, lineno)
</pre>
<p>The variable argument is completely macro-expanded before it is inserted
into the macro expansion, just like an ordinary argument. You may use
the ‘<samp><span class="samp">#</span></samp>’ and ‘<samp><span class="samp">##</span></samp>’ operators to stringify the variable argument
or to paste its leading or trailing token with another token. (But see
below for an important special case for ‘<samp><span class="samp">##</span></samp>’.)
<p>If your macro is complicated, you may want a more descriptive name for
the variable argument than <code>__VA_ARGS__<!-- /@w --></code>. CPP permits
this, as an extension. You may write an argument name immediately
before the ‘<samp><span class="samp">...</span></samp>’; that name is used for the variable argument.
The <code>eprintf</code> macro above could be written
<pre class="smallexample"> #define eprintf(args...) fprintf (stderr, args)
</pre>
<p class="noindent">using this extension. You cannot use <code>__VA_ARGS__<!-- /@w --></code> and this
extension in the same macro.
<p>You can have named arguments as well as variable arguments in a variadic
macro. We could define <code>eprintf</code> like this, instead:
<pre class="smallexample"> #define eprintf(format, ...) fprintf (stderr, format, __VA_ARGS__)
</pre>
<p class="noindent">This formulation looks more descriptive, but unfortunately it is less
flexible: you must now supply at least one argument after the format
string. In standard C, you cannot omit the comma separating the named
argument from the variable arguments. Furthermore, if you leave the
variable argument empty, you will get a syntax error, because
there will be an extra comma after the format string.
<pre class="smallexample"> eprintf("success!\n", );
==> fprintf(stderr, "success!\n", );
</pre>
<p>GNU CPP has a pair of extensions which deal with this problem. First,
you are allowed to leave the variable argument out entirely:
<pre class="smallexample"> eprintf ("success!\n")
==> fprintf(stderr, "success!\n", );
</pre>
<p class="noindent">Second, the ‘<samp><span class="samp">##</span></samp>’ token paste operator has a special meaning when
placed between a comma and a variable argument. If you write
<pre class="smallexample"> #define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
</pre>
<p class="noindent">and the variable argument is left out when the <code>eprintf</code> macro is
used, then the comma before the ‘<samp><span class="samp">##</span></samp>’ will be deleted. This does
<em>not</em> happen if you pass an empty argument, nor does it happen if
the token preceding ‘<samp><span class="samp">##</span></samp>’ is anything other than a comma.
<pre class="smallexample"> eprintf ("success!\n")
==> fprintf(stderr, "success!\n");
</pre>
<p class="noindent">The above explanation is ambiguous about the case where the only macro
parameter is a variable arguments parameter, as it is meaningless to
try to distinguish whether no argument at all is an empty argument or
a missing argument. In this case the C99 standard is clear that the
comma must remain, however the existing GCC extension used to swallow
the comma. So CPP retains the comma when conforming to a specific C
standard, and drops it otherwise.
<p>C99 mandates that the only place the identifier <code>__VA_ARGS__<!-- /@w --></code>
can appear is in the replacement list of a variadic macro. It may not
be used as a macro name, macro argument name, or within a different type
of macro. It may also be forbidden in open text; the standard is
ambiguous. We recommend you avoid using it except for its defined
purpose.
<p>Variadic macros are a new feature in C99. GNU CPP has supported them
for a long time, but only with a named variable argument
(‘<samp><span class="samp">args...</span></samp>’, not ‘<samp><span class="samp">...</span></samp>’ and <code>__VA_ARGS__<!-- /@w --></code>). If you are
concerned with portability to previous versions of GCC, you should use
only named variable arguments. On the other hand, if you are concerned
with portability to other conforming implementations of C99, you should
use only <code>__VA_ARGS__<!-- /@w --></code>.
<p>Previous versions of CPP implemented the comma-deletion extension
much more generally. We have restricted it in this release to minimize
the differences from C99. To get the same effect with both this and
previous versions of GCC, the token preceding the special ‘<samp><span class="samp">##</span></samp>’ must
be a comma, and there must be white space between that comma and
whatever comes immediately before it:
<pre class="smallexample"> #define eprintf(format, args...) fprintf (stderr, format , ##args)
</pre>
<p class="noindent">See <a href="#Differences-from-previous-versions">Differences from previous versions</a>, for the gory details.
<div class="node">
<a name="Predefined-Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a>,
Previous: <a rel="previous" accesskey="p" href="#Variadic-Macros">Variadic Macros</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.7 Predefined Macros</h3>
<p><a name="index-predefined-macros-59"></a>Several object-like macros are predefined; you use them without
supplying their definitions. They fall into three classes: standard,
common, and system-specific.
<p>In C++, there is a fourth category, the named operators. They act like
predefined macros, but you cannot undefine them.
<ul class="menu">
<li><a accesskey="1" href="#Standard-Predefined-Macros">Standard Predefined Macros</a>
<li><a accesskey="2" href="#Common-Predefined-Macros">Common Predefined Macros</a>
<li><a accesskey="3" href="#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>
<li><a accesskey="4" href="#C_002b_002b-Named-Operators">C++ Named Operators</a>
</ul>
<div class="node">
<a name="Standard-Predefined-Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Common-Predefined-Macros">Common Predefined Macros</a>,
Up: <a rel="up" accesskey="u" href="#Predefined-Macros">Predefined Macros</a>
</div>
<h4 class="subsection">3.7.1 Standard Predefined Macros</h4>
<p><a name="index-standard-predefined-macros_002e-60"></a>
The standard predefined macros are specified by the relevant
language standards, so they are available with all compilers that
implement those standards. Older compilers may not provide all of
them. Their names all start with double underscores.
<dl>
<dt><code>__FILE__</code><dd>This macro expands to the name of the current input file, in the form of
a C string constant. This is the path by which the preprocessor opened
the file, not the short name specified in ‘<samp><span class="samp">#include</span></samp>’ or as the
input file name argument. For example,
<code>"/usr/local/include/myheader.h"</code> is a possible expansion of this
macro.
<br><dt><code>__LINE__</code><dd>This macro expands to the current input line number, in the form of a
decimal integer constant. While we call it a predefined macro, it's
a pretty strange macro, since its “definition” changes with each
new line of source code.
</dl>
<p><code>__FILE__</code> and <code>__LINE__</code> are useful in generating an error
message to report an inconsistency detected by the program; the message
can state the source line at which the inconsistency was detected. For
example,
<pre class="smallexample"> fprintf (stderr, "Internal error: "
"negative string length "
"%d at %s, line %d.",
length, __FILE__, __LINE__);
</pre>
<p>An ‘<samp><span class="samp">#include</span></samp>’ directive changes the expansions of <code>__FILE__</code>
and <code>__LINE__</code> to correspond to the included file. At the end of
that file, when processing resumes on the input file that contained
the ‘<samp><span class="samp">#include</span></samp>’ directive, the expansions of <code>__FILE__</code> and
<code>__LINE__</code> revert to the values they had before the
‘<samp><span class="samp">#include</span></samp>’ (but <code>__LINE__</code> is then incremented by one as
processing moves to the line after the ‘<samp><span class="samp">#include</span></samp>’).
<p>A ‘<samp><span class="samp">#line</span></samp>’ directive changes <code>__LINE__</code>, and may change
<code>__FILE__</code> as well. See <a href="#Line-Control">Line Control</a>.
<p>C99 introduces <code>__func__</code>, and GCC has provided <code>__FUNCTION__</code>
for a long time. Both of these are strings containing the name of the
current function (there are slight semantic differences; see the GCC
manual). Neither of them is a macro; the preprocessor does not know the
name of the current function. They tend to be useful in conjunction
with <code>__FILE__</code> and <code>__LINE__</code>, though.
<dl>
<dt><code>__DATE__</code><dd>This macro expands to a string constant that describes the date on which
the preprocessor is being run. The string constant contains eleven
characters and looks like <code>"Feb 12 1996"<!-- /@w --></code>. If the day of the
month is less than 10, it is padded with a space on the left.
<p>If GCC cannot determine the current date, it will emit a warning message
(once per compilation) and <code>__DATE__</code> will expand to
<code>"??? ?? ????"<!-- /@w --></code>.
<br><dt><code>__TIME__</code><dd>This macro expands to a string constant that describes the time at
which the preprocessor is being run. The string constant contains
eight characters and looks like <code>"23:59:01"</code>.
<p>If GCC cannot determine the current time, it will emit a warning message
(once per compilation) and <code>__TIME__</code> will expand to
<code>"??:??:??"</code>.
<br><dt><code>__STDC__</code><dd>In normal operation, this macro expands to the constant 1, to signify
that this compiler conforms to ISO Standard C. If GNU CPP is used with
a compiler other than GCC, this is not necessarily true; however, the
preprocessor always conforms to the standard unless the
<samp><span class="option">-traditional-cpp</span></samp> option is used.
<p>This macro is not defined if the <samp><span class="option">-traditional-cpp</span></samp> option is used.
<p>On some hosts, the system compiler uses a different convention, where
<code>__STDC__</code> is normally 0, but is 1 if the user specifies strict
conformance to the C Standard. CPP follows the host convention when
processing system header files, but when processing user files
<code>__STDC__</code> is always 1. This has been reported to cause problems;
for instance, some versions of Solaris provide X Windows headers that
expect <code>__STDC__</code> to be either undefined or 1. See <a href="#Invocation">Invocation</a>.
<br><dt><code>__STDC_VERSION__</code><dd>This macro expands to the C Standard's version number, a long integer
constant of the form <var>yyyy</var><var>mm</var><code>L</code> where <var>yyyy</var> and
<var>mm</var> are the year and month of the Standard version. This signifies
which version of the C Standard the compiler conforms to. Like
<code>__STDC__</code>, this is not necessarily accurate for the entire
implementation, unless GNU CPP is being used with GCC.
<p>The value <code>199409L</code> signifies the 1989 C standard as amended in
1994, which is the current default; the value <code>199901L</code> signifies
the 1999 revision of the C standard. Support for the 1999 revision is
not yet complete.
<p>This macro is not defined if the <samp><span class="option">-traditional-cpp</span></samp> option is
used, nor when compiling C++ or Objective-C.
<br><dt><code>__STDC_HOSTED__</code><dd>This macro is defined, with value 1, if the compiler's target is a
<dfn>hosted environment</dfn>. A hosted environment has the complete
facilities of the standard C library available.
<br><dt><code>__cplusplus</code><dd>This macro is defined when the C++ compiler is in use. You can use
<code>__cplusplus</code> to test whether a header is compiled by a C compiler
or a C++ compiler. This macro is similar to <code>__STDC_VERSION__</code>, in
that it expands to a version number. A fully conforming implementation
of the 1998 C++ standard will define this macro to <code>199711L</code>. The
GNU C++ compiler is not yet fully conforming, so it uses <code>1</code>
instead. It is hoped to complete the implementation of standard C++
in the near future.
<br><dt><code>__OBJC__</code><dd>This macro is defined, with value 1, when the Objective-C compiler is in
use. You can use <code>__OBJC__</code> to test whether a header is compiled
by a C compiler or an Objective-C compiler.
<br><dt><code>__ASSEMBLER__</code><dd>This macro is defined with value 1 when preprocessing assembly
language.
</dl>
<div class="node">
<a name="Common-Predefined-Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>,
Previous: <a rel="previous" accesskey="p" href="#Standard-Predefined-Macros">Standard Predefined Macros</a>,
Up: <a rel="up" accesskey="u" href="#Predefined-Macros">Predefined Macros</a>
</div>
<h4 class="subsection">3.7.2 Common Predefined Macros</h4>
<p><a name="index-common-predefined-macros-61"></a>
The common predefined macros are GNU C extensions. They are available
with the same meanings regardless of the machine or operating system on
which you are using GNU C or GNU Fortran. Their names all start with
double underscores.
<dl>
<dt><code>__COUNTER__</code><dd>This macro expands to sequential integral values starting from 0. In
conjunction with the <code>##</code> operator, this provides a convenient means to
generate unique identifiers. Care must be taken to ensure that
<code>__COUNTER__</code> is not expanded prior to inclusion of precompiled headers
which use it. Otherwise, the precompiled headers will not be used.
<br><dt><code>__GFORTRAN__</code><dd>The GNU Fortran compiler defines this.
<br><dt><code>__GNUC__</code><dt><code>__GNUC_MINOR__</code><dt><code>__GNUC_PATCHLEVEL__</code><dd>These macros are defined by all GNU compilers that use the C
preprocessor: C, C++, Objective-C and Fortran. Their values are the major
version, minor version, and patch level of the compiler, as integer
constants. For example, GCC 3.2.1 will define <code>__GNUC__</code> to 3,
<code>__GNUC_MINOR__</code> to 2, and <code>__GNUC_PATCHLEVEL__</code> to 1. These
macros are also defined if you invoke the preprocessor directly.
<p><code>__GNUC_PATCHLEVEL__</code> is new to GCC 3.0; it is also present in the
widely-used development snapshots leading up to 3.0 (which identify
themselves as GCC 2.96 or 2.97, depending on which snapshot you have).
<p>If all you need to know is whether or not your program is being compiled
by GCC, or a non-GCC compiler that claims to accept the GNU C dialects,
you can simply test <code>__GNUC__</code>. If you need to write code
which depends on a specific version, you must be more careful. Each
time the minor version is increased, the patch level is reset to zero;
each time the major version is increased (which happens rarely), the
minor version and patch level are reset. If you wish to use the
predefined macros directly in the conditional, you will need to write it
like this:
<pre class="smallexample"> /* <span class="roman">Test for GCC > 3.2.0</span> */
#if __GNUC__ > 3 || \
(__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
(__GNUC_MINOR__ == 2 && \
__GNUC_PATCHLEVEL__ > 0))
</pre>
<p class="noindent">Another approach is to use the predefined macros to
calculate a single number, then compare that against a threshold:
<pre class="smallexample"> #define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
...
/* <span class="roman">Test for GCC > 3.2.0</span> */
#if GCC_VERSION > 30200
</pre>
<p class="noindent">Many people find this form easier to understand.
<br><dt><code>__GNUG__</code><dd>The GNU C++ compiler defines this. Testing it is equivalent to
testing <code>(__GNUC__ && __cplusplus)<!-- /@w --></code>.
<br><dt><code>__STRICT_ANSI__</code><dd>GCC defines this macro if and only if the <samp><span class="option">-ansi</span></samp> switch, or a
<samp><span class="option">-std</span></samp> switch specifying strict conformance to some version of ISO C,
was specified when GCC was invoked. It is defined to ‘<samp><span class="samp">1</span></samp>’.
This macro exists primarily to direct GNU libc's header files to
restrict their definitions to the minimal set found in the 1989 C
standard.
<br><dt><code>__BASE_FILE__</code><dd>This macro expands to the name of the main input file, in the form
of a C string constant. This is the source file that was specified
on the command line of the preprocessor or C compiler.
<br><dt><code>__INCLUDE_LEVEL__</code><dd>This macro expands to a decimal integer constant that represents the
depth of nesting in include files. The value of this macro is
incremented on every ‘<samp><span class="samp">#include</span></samp>’ directive and decremented at the
end of every included file. It starts out at 0, its value within the
base file specified on the command line.
<br><dt><code>__ELF__</code><dd>This macro is defined if the target uses the ELF object format.
<br><dt><code>__VERSION__</code><dd>This macro expands to a string constant which describes the version of
the compiler in use. You should not rely on its contents having any
particular form, but it can be counted on to contain at least the
release number.
<br><dt><code>__OPTIMIZE__</code><dt><code>__OPTIMIZE_SIZE__</code><dt><code>__NO_INLINE__</code><dd>These macros describe the compilation mode. <code>__OPTIMIZE__</code> is
defined in all optimizing compilations. <code>__OPTIMIZE_SIZE__</code> is
defined if the compiler is optimizing for size, not speed.
<code>__NO_INLINE__</code> is defined if no functions will be inlined into
their callers (when not optimizing, or when inlining has been
specifically disabled by <samp><span class="option">-fno-inline</span></samp>).
<p>These macros cause certain GNU header files to provide optimized
definitions, using macros or inline functions, of system library
functions. You should not use these macros in any way unless you make
sure that programs will execute with the same effect whether or not they
are defined. If they are defined, their value is 1.
<br><dt><code>__GNUC_GNU_INLINE__</code><dd>GCC defines this macro if functions declared <code>inline</code> will be
handled in GCC's traditional gnu90 mode. Object files will contain
externally visible definitions of all functions declared <code>inline</code>
without <code>extern</code> or <code>static</code>. They will not contain any
definitions of any functions declared <code>extern inline</code>.
<br><dt><code>__GNUC_STDC_INLINE__</code><dd>GCC defines this macro if functions declared <code>inline</code> will be
handled according to the ISO C99 standard. Object files will contain
externally visible definitions of all functions declared <code>extern
inline</code>. They will not contain definitions of any functions declared
<code>inline</code> without <code>extern</code>.
<p>If this macro is defined, GCC supports the <code>gnu_inline</code> function
attribute as a way to always get the gnu90 behavior. Support for
this and <code>__GNUC_GNU_INLINE__</code> was added in GCC 4.1.3. If
neither macro is defined, an older version of GCC is being used:
<code>inline</code> functions will be compiled in gnu90 mode, and the
<code>gnu_inline</code> function attribute will not be recognized.
<br><dt><code>__CHAR_UNSIGNED__</code><dd>GCC defines this macro if and only if the data type <code>char</code> is
unsigned on the target machine. It exists to cause the standard header
file <samp><span class="file">limits.h</span></samp> to work correctly. You should not use this macro
yourself; instead, refer to the standard macros defined in <samp><span class="file">limits.h</span></samp>.
<br><dt><code>__WCHAR_UNSIGNED__</code><dd>Like <code>__CHAR_UNSIGNED__</code>, this macro is defined if and only if the
data type <code>wchar_t</code> is unsigned and the front-end is in C++ mode.
<br><dt><code>__REGISTER_PREFIX__</code><dd>This macro expands to a single token (not a string constant) which is
the prefix applied to CPU register names in assembly language for this
target. You can use it to write assembly that is usable in multiple
environments. For example, in the <code>m68k-aout</code> environment it
expands to nothing, but in the <code>m68k-coff</code> environment it expands
to a single ‘<samp><span class="samp">%</span></samp>’.
<br><dt><code>__USER_LABEL_PREFIX__</code><dd>This macro expands to a single token which is the prefix applied to
user labels (symbols visible to C code) in assembly. For example, in
the <code>m68k-aout</code> environment it expands to an ‘<samp><span class="samp">_</span></samp>’, but in the
<code>m68k-coff</code> environment it expands to nothing.
<p>This macro will have the correct definition even if
<samp><span class="option">-f(no-)underscores</span></samp> is in use, but it will not be correct if
target-specific options that adjust this prefix are used (e.g. the
OSF/rose <samp><span class="option">-mno-underscores</span></samp> option).
<br><dt><code>__SIZE_TYPE__</code><dt><code>__PTRDIFF_TYPE__</code><dt><code>__WCHAR_TYPE__</code><dt><code>__WINT_TYPE__</code><dt><code>__INTMAX_TYPE__</code><dt><code>__UINTMAX_TYPE__</code><dt><code>__SIG_ATOMIC_TYPE__</code><dt><code>__INT8_TYPE__</code><dt><code>__INT16_TYPE__</code><dt><code>__INT32_TYPE__</code><dt><code>__INT64_TYPE__</code><dt><code>__UINT8_TYPE__</code><dt><code>__UINT16_TYPE__</code><dt><code>__UINT32_TYPE__</code><dt><code>__UINT64_TYPE__</code><dt><code>__INT_LEAST8_TYPE__</code><dt><code>__INT_LEAST16_TYPE__</code><dt><code>__INT_LEAST32_TYPE__</code><dt><code>__INT_LEAST64_TYPE__</code><dt><code>__UINT_LEAST8_TYPE__</code><dt><code>__UINT_LEAST16_TYPE__</code><dt><code>__UINT_LEAST32_TYPE__</code><dt><code>__UINT_LEAST64_TYPE__</code><dt><code>__INT_FAST8_TYPE__</code><dt><code>__INT_FAST16_TYPE__</code><dt><code>__INT_FAST32_TYPE__</code><dt><code>__INT_FAST64_TYPE__</code><dt><code>__UINT_FAST8_TYPE__</code><dt><code>__UINT_FAST16_TYPE__</code><dt><code>__UINT_FAST32_TYPE__</code><dt><code>__UINT_FAST64_TYPE__</code><dt><code>__INTPTR_TYPE__</code><dt><code>__UINTPTR_TYPE__</code><dd>These macros are defined to the correct underlying types for the
<code>size_t</code>, <code>ptrdiff_t</code>, <code>wchar_t</code>, <code>wint_t</code>,
<code>intmax_t</code>, <code>uintmax_t</code>, <code>sig_atomic_t</code>, <code>int8_t</code>,
<code>int16_t</code>, <code>int32_t</code>, <code>int64_t</code>, <code>uint8_t</code>,
<code>uint16_t</code>, <code>uint32_t</code>, <code>uint64_t</code>,
<code>int_least8_t</code>, <code>int_least16_t</code>, <code>int_least32_t</code>,
<code>int_least64_t</code>, <code>uint_least8_t</code>, <code>uint_least16_t</code>,
<code>uint_least32_t</code>, <code>uint_least64_t</code>, <code>int_fast8_t</code>,
<code>int_fast16_t</code>, <code>int_fast32_t</code>, <code>int_fast64_t</code>,
<code>uint_fast8_t</code>, <code>uint_fast16_t</code>, <code>uint_fast32_t</code>,
<code>uint_fast64_t</code>, <code>intptr_t</code>, and <code>uintptr_t</code> typedefs,
respectively. They exist to make the standard header files
<samp><span class="file">stddef.h</span></samp>, <samp><span class="file">stdint.h</span></samp>, and <samp><span class="file">wchar.h</span></samp> work correctly.
You should not use these macros directly; instead, include the
appropriate headers and use the typedefs. Some of these macros may
not be defined on particular systems if GCC does not provide a
<samp><span class="file">stdint.h</span></samp> header on those systems.
<br><dt><code>__CHAR_BIT__</code><dd>Defined to the number of bits used in the representation of the
<code>char</code> data type. It exists to make the standard header given
numerical limits work correctly. You should not use
this macro directly; instead, include the appropriate headers.
<br><dt><code>__SCHAR_MAX__</code><dt><code>__WCHAR_MAX__</code><dt><code>__SHRT_MAX__</code><dt><code>__INT_MAX__</code><dt><code>__LONG_MAX__</code><dt><code>__LONG_LONG_MAX__</code><dt><code>__WINT_MAX__</code><dt><code>__SIZE_MAX__</code><dt><code>__PTRDIFF_MAX__</code><dt><code>__INTMAX_MAX__</code><dt><code>__UINTMAX_MAX__</code><dt><code>__SIG_ATOMIC_MAX__</code><dt><code>__INT8_MAX__</code><dt><code>__INT16_MAX__</code><dt><code>__INT32_MAX__</code><dt><code>__INT64_MAX__</code><dt><code>__UINT8_MAX__</code><dt><code>__UINT16_MAX__</code><dt><code>__UINT32_MAX__</code><dt><code>__UINT64_MAX__</code><dt><code>__INT_LEAST8_MAX__</code><dt><code>__INT_LEAST16_MAX__</code><dt><code>__INT_LEAST32_MAX__</code><dt><code>__INT_LEAST64_MAX__</code><dt><code>__UINT_LEAST8_MAX__</code><dt><code>__UINT_LEAST16_MAX__</code><dt><code>__UINT_LEAST32_MAX__</code><dt><code>__UINT_LEAST64_MAX__</code><dt><code>__INT_FAST8_MAX__</code><dt><code>__INT_FAST16_MAX__</code><dt><code>__INT_FAST32_MAX__</code><dt><code>__INT_FAST64_MAX__</code><dt><code>__UINT_FAST8_MAX__</code><dt><code>__UINT_FAST16_MAX__</code><dt><code>__UINT_FAST32_MAX__</code><dt><code>__UINT_FAST64_MAX__</code><dt><code>__INTPTR_MAX__</code><dt><code>__UINTPTR_MAX__</code><dt><code>__WCHAR_MIN__</code><dt><code>__WINT_MIN__</code><dt><code>__SIG_ATOMIC_MIN__</code><dd>Defined to the maximum value of the <code>signed char</code>, <code>wchar_t</code>,
<code>signed short</code>,
<code>signed int</code>, <code>signed long</code>, <code>signed long long</code>,
<code>wint_t</code>, <code>size_t</code>, <code>ptrdiff_t</code>,
<code>intmax_t</code>, <code>uintmax_t</code>, <code>sig_atomic_t</code>, <code>int8_t</code>,
<code>int16_t</code>, <code>int32_t</code>, <code>int64_t</code>, <code>uint8_t</code>,
<code>uint16_t</code>, <code>uint32_t</code>, <code>uint64_t</code>,
<code>int_least8_t</code>, <code>int_least16_t</code>, <code>int_least32_t</code>,
<code>int_least64_t</code>, <code>uint_least8_t</code>, <code>uint_least16_t</code>,
<code>uint_least32_t</code>, <code>uint_least64_t</code>, <code>int_fast8_t</code>,
<code>int_fast16_t</code>, <code>int_fast32_t</code>, <code>int_fast64_t</code>,
<code>uint_fast8_t</code>, <code>uint_fast16_t</code>, <code>uint_fast32_t</code>,
<code>uint_fast64_t</code>, <code>intptr_t</code>, and <code>uintptr_t</code> types and
to the minimum value of the <code>wchar_t</code>, <code>wint_t</code>, and
<code>sig_atomic_t</code> types respectively. They exist to make the
standard header given numerical limits work correctly. You should not
use these macros directly; instead, include the appropriate headers.
Some of these macros may not be defined on particular systems if GCC
does not provide a <samp><span class="file">stdint.h</span></samp> header on those systems.
<br><dt><code>__INT8_C</code><dt><code>__INT16_C</code><dt><code>__INT32_C</code><dt><code>__INT64_C</code><dt><code>__UINT8_C</code><dt><code>__UINT16_C</code><dt><code>__UINT32_C</code><dt><code>__UINT64_C</code><dt><code>__INTMAX_C</code><dt><code>__UINTMAX_C</code><dd>Defined to implementations of the standard <samp><span class="file">stdint.h</span></samp> macros with
the same names without the leading <code>__</code>. They exist the make the
implementation of that header work correctly. You should not use
these macros directly; instead, include the appropriate headers. Some
of these macros may not be defined on particular systems if GCC does
not provide a <samp><span class="file">stdint.h</span></samp> header on those systems.
<br><dt><code>__SIZEOF_INT__</code><dt><code>__SIZEOF_LONG__</code><dt><code>__SIZEOF_LONG_LONG__</code><dt><code>__SIZEOF_SHORT__</code><dt><code>__SIZEOF_POINTER__</code><dt><code>__SIZEOF_FLOAT__</code><dt><code>__SIZEOF_DOUBLE__</code><dt><code>__SIZEOF_LONG_DOUBLE__</code><dt><code>__SIZEOF_SIZE_T__</code><dt><code>__SIZEOF_WCHAR_T__</code><dt><code>__SIZEOF_WINT_T__</code><dt><code>__SIZEOF_PTRDIFF_T__</code><dd>Defined to the number of bytes of the C standard data types: <code>int</code>,
<code>long</code>, <code>long long</code>, <code>short</code>, <code>void *</code>, <code>float</code>,
<code>double</code>, <code>long double</code>, <code>size_t</code>, <code>wchar_t</code>, <code>wint_t</code>
and <code>ptrdiff_t</code>.
<br><dt><code>__BYTE_ORDER__</code><dt><code>__ORDER_LITTLE_ENDIAN__</code><dt><code>__ORDER_BIG_ENDIAN__</code><dt><code>__ORDER_PDP_ENDIAN__</code><dd><code>__BYTE_ORDER__</code> is defined to one of the values
<code>__ORDER_LITTLE_ENDIAN__</code>, <code>__ORDER_BIG_ENDIAN__</code>, or
<code>__ORDER_PDP_ENDIAN__</code> to reflect the layout of multi-byte and
multi-word quantities in memory. If <code>__BYTE_ORDER__</code> is equal to
<code>__ORDER_LITTLE_ENDIAN__</code> or <code>__ORDER_BIG_ENDIAN__</code>, then
multi-byte and multi-word quantities are laid out identically: the
byte (word) at the lowest address is the least significant or most
significant byte (word) of the quantity, respectively. If
<code>__BYTE_ORDER__</code> is equal to <code>__ORDER_PDP_ENDIAN__</code>, then
bytes in 16-bit words are laid out in a little-endian fashion, whereas
the 16-bit subwords of a 32-bit quantity are laid out in big-endian
fashion.
<p>You should use these macros for testing like this:
<pre class="smallexample"> /* <span class="roman">Test for a little-endian machine</span> */
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
</pre>
<br><dt><code>__FLOAT_WORD_ORDER__</code><dd><code>__FLOAT_WORD_ORDER__</code> is defined to one of the values
<code>__ORDER_LITTLE_ENDIAN__</code> or <code>__ORDER_BIG_ENDIAN__</code> to reflect
the layout of the words of multi-word floating-point quantities.
<br><dt><code>__DEPRECATED</code><dd>This macro is defined, with value 1, when compiling a C++ source file
with warnings about deprecated constructs enabled. These warnings are
enabled by default, but can be disabled with <samp><span class="option">-Wno-deprecated</span></samp>.
<br><dt><code>__EXCEPTIONS</code><dd>This macro is defined, with value 1, when compiling a C++ source file
with exceptions enabled. If <samp><span class="option">-fno-exceptions</span></samp> is used when
compiling the file, then this macro is not defined.
<br><dt><code>__GXX_RTTI</code><dd>This macro is defined, with value 1, when compiling a C++ source file
with runtime type identification enabled. If <samp><span class="option">-fno-rtti</span></samp> is
used when compiling the file, then this macro is not defined.
<br><dt><code>__USING_SJLJ_EXCEPTIONS__</code><dd>This macro is defined, with value 1, if the compiler uses the old
mechanism based on <code>setjmp</code> and <code>longjmp</code> for exception
handling.
<br><dt><code>__GXX_EXPERIMENTAL_CXX0X__</code><dd>This macro is defined when compiling a C++ source file with the option
<samp><span class="option">-std=c++0x</span></samp> or <samp><span class="option">-std=gnu++0x</span></samp>. It indicates that some
features likely to be included in C++0x are available. Note that these
features are experimental, and may change or be removed in future
versions of GCC.
<br><dt><code>__GXX_WEAK__</code><dd>This macro is defined when compiling a C++ source file. It has the
value 1 if the compiler will use weak symbols, COMDAT sections, or
other similar techniques to collapse symbols with “vague linkage”
that are defined in multiple translation units. If the compiler will
not collapse such symbols, this macro is defined with value 0. In
general, user code should not need to make use of this macro; the
purpose of this macro is to ease implementation of the C++ runtime
library provided with G++.
<br><dt><code>__NEXT_RUNTIME__</code><dd>This macro is defined, with value 1, if (and only if) the NeXT runtime
(as in <samp><span class="option">-fnext-runtime</span></samp>) is in use for Objective-C. If the GNU
runtime is used, this macro is not defined, so that you can use this
macro to determine which runtime (NeXT or GNU) is being used.
<br><dt><code>__LP64__</code><dt><code>_LP64</code><dd>These macros are defined, with value 1, if (and only if) the compilation
is for a target where <code>long int</code> and pointer both use 64-bits and
<code>int</code> uses 32-bit.
<br><dt><code>__SSP__</code><dd>This macro is defined, with value 1, when <samp><span class="option">-fstack-protector</span></samp> is in
use.
<br><dt><code>__SSP_ALL__</code><dd>This macro is defined, with value 2, when <samp><span class="option">-fstack-protector-all</span></samp> is
in use.
<br><dt><code>__TIMESTAMP__</code><dd>This macro expands to a string constant that describes the date and time
of the last modification of the current source file. The string constant
contains abbreviated day of the week, month, day of the month, time in
hh:mm:ss form, year and looks like <code>"Sun Sep 16 01:03:52 1973"<!-- /@w --></code>.
If the day of the month is less than 10, it is padded with a space on the left.
<p>If GCC cannot determine the current date, it will emit a warning message
(once per compilation) and <code>__TIMESTAMP__</code> will expand to
<code>"??? ??? ?? ??:??:?? ????"<!-- /@w --></code>.
<br><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1</code><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2</code><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4</code><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8</code><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16</code><dd>These macros are defined when the target processor supports atomic compare
and swap operations on operands 1, 2, 4, 8 or 16 bytes in length, respectively.
<br><dt><code>__GCC_HAVE_DWARF2_CFI_ASM</code><dd>This macro is defined when the compiler is emitting Dwarf2 CFI directives
to the assembler. When this is defined, it is possible to emit those same
directives in inline assembly.
<br><dt><code>__FP_FAST_FMA</code><dt><code>__FP_FAST_FMAF</code><dt><code>__FP_FAST_FMAL</code><dd>These macros are defined with value 1 if the backend supports the
<code>fma</code>, <code>fmaf</code>, and <code>fmal</code> builtin functions, so that
the include file <samp><span class="file">math.h</span></samp> can define the macros
<code>FP_FAST_FMA</code>, <code>FP_FAST_FMAF</code>, and <code>FP_FAST_FMAL</code>
for compatibility with the 1999 C standard.
</dl>
<div class="node">
<a name="System-specific-Predefined-Macros"></a>
<a name="System_002dspecific-Predefined-Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#C_002b_002b-Named-Operators">C++ Named Operators</a>,
Previous: <a rel="previous" accesskey="p" href="#Common-Predefined-Macros">Common Predefined Macros</a>,
Up: <a rel="up" accesskey="u" href="#Predefined-Macros">Predefined Macros</a>
</div>
<h4 class="subsection">3.7.3 System-specific Predefined Macros</h4>
<p><a name="index-system_002dspecific-predefined-macros-62"></a><a name="index-predefined-macros_002c-system_002dspecific-63"></a><a name="index-reserved-namespace-64"></a>
The C preprocessor normally predefines several macros that indicate what
type of system and machine is in use. They are obviously different on
each target supported by GCC. This manual, being for all systems and
machines, cannot tell you what their names are, but you can use
<samp><span class="command">cpp -dM</span></samp> to see them all. See <a href="#Invocation">Invocation</a>. All system-specific
predefined macros expand to the constant 1, so you can test them with
either ‘<samp><span class="samp">#ifdef</span></samp>’ or ‘<samp><span class="samp">#if</span></samp>’.
<p>The C standard requires that all system-specific macros be part of the
<dfn>reserved namespace</dfn>. All names which begin with two underscores,
or an underscore and a capital letter, are reserved for the compiler and
library to use as they wish. However, historically system-specific
macros have had names with no special prefix; for instance, it is common
to find <code>unix</code> defined on Unix systems. For all such macros, GCC
provides a parallel macro with two underscores added at the beginning
and the end. If <code>unix</code> is defined, <code>__unix__</code> will be defined
too. There will never be more than two underscores; the parallel of
<code>_mips</code> is <code>__mips__</code>.
<p>When the <samp><span class="option">-ansi</span></samp> option, or any <samp><span class="option">-std</span></samp> option that
requests strict conformance, is given to the compiler, all the
system-specific predefined macros outside the reserved namespace are
suppressed. The parallel macros, inside the reserved namespace, remain
defined.
<p>We are slowly phasing out all predefined macros which are outside the
reserved namespace. You should never use them in new programs, and we
encourage you to correct older code to use the parallel macros whenever
you find it. We don't recommend you use the system-specific macros that
are in the reserved namespace, either. It is better in the long run to
check specifically for features you need, using a tool such as
<samp><span class="command">autoconf</span></samp>.
<div class="node">
<a name="C++-Named-Operators"></a>
<a name="C_002b_002b-Named-Operators"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>,
Up: <a rel="up" accesskey="u" href="#Predefined-Macros">Predefined Macros</a>
</div>
<h4 class="subsection">3.7.4 C++ Named Operators</h4>
<p><a name="index-named-operators-65"></a><a name="index-C_002b_002b-named-operators-66"></a><a name="index-g_t_0040file_007biso646_002eh_007d-67"></a>
In C++, there are eleven keywords which are simply alternate spellings
of operators normally written with punctuation. These keywords are
treated as such even in the preprocessor. They function as operators in
‘<samp><span class="samp">#if</span></samp>’, and they cannot be defined as macros or poisoned. In C, you
can request that those keywords take their C++ meaning by including
<samp><span class="file">iso646.h</span></samp>. That header defines each one as a normal object-like
macro expanding to the appropriate punctuator.
<p>These are the named operators and their corresponding punctuators:
<p><table summary=""><tr align="left"><td valign="top">Named Operator </td><td valign="top">Punctuator
<br></td></tr><tr align="left"><td valign="top"><code>and</code> </td><td valign="top"><code>&&</code>
<br></td></tr><tr align="left"><td valign="top"><code>and_eq</code> </td><td valign="top"><code>&=</code>
<br></td></tr><tr align="left"><td valign="top"><code>bitand</code> </td><td valign="top"><code>&</code>
<br></td></tr><tr align="left"><td valign="top"><code>bitor</code> </td><td valign="top"><code>|</code>
<br></td></tr><tr align="left"><td valign="top"><code>compl</code> </td><td valign="top"><code>~</code>
<br></td></tr><tr align="left"><td valign="top"><code>not</code> </td><td valign="top"><code>!</code>
<br></td></tr><tr align="left"><td valign="top"><code>not_eq</code> </td><td valign="top"><code>!=</code>
<br></td></tr><tr align="left"><td valign="top"><code>or</code> </td><td valign="top"><code>||</code>
<br></td></tr><tr align="left"><td valign="top"><code>or_eq</code> </td><td valign="top"><code>|=</code>
<br></td></tr><tr align="left"><td valign="top"><code>xor</code> </td><td valign="top"><code>^</code>
<br></td></tr><tr align="left"><td valign="top"><code>xor_eq</code> </td><td valign="top"><code>^=</code>
<br></td></tr></table>
<div class="node">
<a name="Undefining-and-Redefining-Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a>,
Previous: <a rel="previous" accesskey="p" href="#Predefined-Macros">Predefined Macros</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.8 Undefining and Redefining Macros</h3>
<p><a name="index-undefining-macros-68"></a><a name="index-redefining-macros-69"></a><a name="index-g_t_0023undef-70"></a>
If a macro ceases to be useful, it may be <dfn>undefined</dfn> with the
‘<samp><span class="samp">#undef</span></samp>’ directive. ‘<samp><span class="samp">#undef</span></samp>’ takes a single argument, the
name of the macro to undefine. You use the bare macro name, even if the
macro is function-like. It is an error if anything appears on the line
after the macro name. ‘<samp><span class="samp">#undef</span></samp>’ has no effect if the name is not a
macro.
<pre class="smallexample"> #define FOO 4
x = FOO; ==> x = 4;
#undef FOO
x = FOO; ==> x = FOO;
</pre>
<p>Once a macro has been undefined, that identifier may be <dfn>redefined</dfn>
as a macro by a subsequent ‘<samp><span class="samp">#define</span></samp>’ directive. The new definition
need not have any resemblance to the old definition.
<p>However, if an identifier which is currently a macro is redefined, then
the new definition must be <dfn>effectively the same</dfn> as the old one.
Two macro definitions are effectively the same if:
<ul>
<li>Both are the same type of macro (object- or function-like).
<li>All the tokens of the replacement list are the same.
<li>If there are any parameters, they are the same.
<li>Whitespace appears in the same places in both. It need not be
exactly the same amount of whitespace, though. Remember that comments
count as whitespace.
</ul>
<p class="noindent">These definitions are effectively the same:
<pre class="smallexample"> #define FOUR (2 + 2)
#define FOUR (2 + 2)
#define FOUR (2 /* <span class="roman">two</span> */ + 2)
</pre>
<p class="noindent">but these are not:
<pre class="smallexample"> #define FOUR (2 + 2)
#define FOUR ( 2+2 )
#define FOUR (2 * 2)
#define FOUR(score,and,seven,years,ago) (2 + 2)
</pre>
<p>If a macro is redefined with a definition that is not effectively the
same as the old one, the preprocessor issues a warning and changes the
macro to use the new definition. If the new definition is effectively
the same, the redefinition is silently ignored. This allows, for
instance, two different headers to define a common macro. The
preprocessor will only complain if the definitions do not match.
<div class="node">
<a name="Directives-Within-Macro-Arguments"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Macro-Pitfalls">Macro Pitfalls</a>,
Previous: <a rel="previous" accesskey="p" href="#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.9 Directives Within Macro Arguments</h3>
<p><a name="index-macro-arguments-and-directives-71"></a>
Occasionally it is convenient to use preprocessor directives within
the arguments of a macro. The C and C++ standards declare that
behavior in these cases is undefined.
<p>Versions of CPP prior to 3.2 would reject such constructs with an
error message. This was the only syntactic difference between normal
functions and function-like macros, so it seemed attractive to remove
this limitation, and people would often be surprised that they could
not use macros in this way. Moreover, sometimes people would use
conditional compilation in the argument list to a normal library
function like ‘<samp><span class="samp">printf</span></samp>’, only to find that after a library upgrade
‘<samp><span class="samp">printf</span></samp>’ had changed to be a function-like macro, and their code
would no longer compile. So from version 3.2 we changed CPP to
successfully process arbitrary directives within macro arguments in
exactly the same way as it would have processed the directive were the
function-like macro invocation not present.
<p>If, within a macro invocation, that macro is redefined, then the new
definition takes effect in time for argument pre-expansion, but the
original definition is still used for argument replacement. Here is a
pathological example:
<pre class="smallexample"> #define f(x) x x
f (1
#undef f
#define f 2
f)
</pre>
<p class="noindent">which expands to
<pre class="smallexample"> 1 2 1 2
</pre>
<p class="noindent">with the semantics described above.
<div class="node">
<a name="Macro-Pitfalls"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a>,
Up: <a rel="up" accesskey="u" href="#Macros">Macros</a>
</div>
<h3 class="section">3.10 Macro Pitfalls</h3>
<p><a name="index-problems-with-macros-72"></a><a name="index-pitfalls-of-macros-73"></a>
In this section we describe some special rules that apply to macros and
macro expansion, and point out certain cases in which the rules have
counter-intuitive consequences that you must watch out for.
<ul class="menu">
<li><a accesskey="1" href="#Misnesting">Misnesting</a>
<li><a accesskey="2" href="#Operator-Precedence-Problems">Operator Precedence Problems</a>
<li><a accesskey="3" href="#Swallowing-the-Semicolon">Swallowing the Semicolon</a>
<li><a accesskey="4" href="#Duplication-of-Side-Effects">Duplication of Side Effects</a>
<li><a accesskey="5" href="#Self_002dReferential-Macros">Self-Referential Macros</a>
<li><a accesskey="6" href="#Argument-Prescan">Argument Prescan</a>
<li><a accesskey="7" href="#Newlines-in-Arguments">Newlines in Arguments</a>
</ul>
<div class="node">
<a name="Misnesting"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Operator-Precedence-Problems">Operator Precedence Problems</a>,
Up: <a rel="up" accesskey="u" href="#Macro-Pitfalls">Macro Pitfalls</a>
</div>
<h4 class="subsection">3.10.1 Misnesting</h4>
<p>When a macro is called with arguments, the arguments are substituted
into the macro body and the result is checked, together with the rest of
the input file, for more macro calls. It is possible to piece together
a macro call coming partially from the macro body and partially from the
arguments. For example,
<pre class="smallexample"> #define twice(x) (2*(x))
#define call_with_1(x) x(1)
call_with_1 (twice)
==> twice(1)
==> (2*(1))
</pre>
<p>Macro definitions do not have to have balanced parentheses. By writing
an unbalanced open parenthesis in a macro body, it is possible to create
a macro call that begins inside the macro body but ends outside of it.
For example,
<pre class="smallexample"> #define strange(file) fprintf (file, "%s %d",
...
strange(stderr) p, 35)
==> fprintf (stderr, "%s %d", p, 35)
</pre>
<p>The ability to piece together a macro call can be useful, but the use of
unbalanced open parentheses in a macro body is just confusing, and
should be avoided.
<div class="node">
<a name="Operator-Precedence-Problems"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Swallowing-the-Semicolon">Swallowing the Semicolon</a>,
Previous: <a rel="previous" accesskey="p" href="#Misnesting">Misnesting</a>,
Up: <a rel="up" accesskey="u" href="#Macro-Pitfalls">Macro Pitfalls</a>
</div>
<h4 class="subsection">3.10.2 Operator Precedence Problems</h4>
<p><a name="index-parentheses-in-macro-bodies-74"></a>
You may have noticed that in most of the macro definition examples shown
above, each occurrence of a macro argument name had parentheses around
it. In addition, another pair of parentheses usually surround the
entire macro definition. Here is why it is best to write macros that
way.
<p>Suppose you define a macro as follows,
<pre class="smallexample"> #define ceil_div(x, y) (x + y - 1) / y
</pre>
<p class="noindent">whose purpose is to divide, rounding up. (One use for this operation is
to compute how many <code>int</code> objects are needed to hold a certain
number of <code>char</code> objects.) Then suppose it is used as follows:
<pre class="smallexample"> a = ceil_div (b & c, sizeof (int));
==> a = (b & c + sizeof (int) - 1) / sizeof (int);
</pre>
<p class="noindent">This does not do what is intended. The operator-precedence rules of
C make it equivalent to this:
<pre class="smallexample"> a = (b & (c + sizeof (int) - 1)) / sizeof (int);
</pre>
<p class="noindent">What we want is this:
<pre class="smallexample"> a = ((b & c) + sizeof (int) - 1)) / sizeof (int);
</pre>
<p class="noindent">Defining the macro as
<pre class="smallexample"> #define ceil_div(x, y) ((x) + (y) - 1) / (y)
</pre>
<p class="noindent">provides the desired result.
<p>Unintended grouping can result in another way. Consider <code>sizeof
ceil_div(1, 2)</code>. That has the appearance of a C expression that would
compute the size of the type of <code>ceil_div (1, 2)</code>, but in fact it
means something very different. Here is what it expands to:
<pre class="smallexample"> sizeof ((1) + (2) - 1) / (2)
</pre>
<p class="noindent">This would take the size of an integer and divide it by two. The
precedence rules have put the division outside the <code>sizeof</code> when it
was intended to be inside.
<p>Parentheses around the entire macro definition prevent such problems.
Here, then, is the recommended way to define <code>ceil_div</code>:
<pre class="smallexample"> #define ceil_div(x, y) (((x) + (y) - 1) / (y))
</pre>
<div class="node">
<a name="Swallowing-the-Semicolon"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Duplication-of-Side-Effects">Duplication of Side Effects</a>,
Previous: <a rel="previous" accesskey="p" href="#Operator-Precedence-Problems">Operator Precedence Problems</a>,
Up: <a rel="up" accesskey="u" href="#Macro-Pitfalls">Macro Pitfalls</a>
</div>
<h4 class="subsection">3.10.3 Swallowing the Semicolon</h4>
<p><a name="index-semicolons-_0028after-macro-calls_0029-75"></a>
Often it is desirable to define a macro that expands into a compound
statement. Consider, for example, the following macro, that advances a
pointer (the argument <code>p</code> says where to find it) across whitespace
characters:
<pre class="smallexample"> #define SKIP_SPACES(p, limit) \
{ char *lim = (limit); \
while (p < lim) { \
if (*p++ != ' ') { \
p--; break; }}}
</pre>
<p class="noindent">Here backslash-newline is used to split the macro definition, which must
be a single logical line, so that it resembles the way such code would
be laid out if not part of a macro definition.
<p>A call to this macro might be <code>SKIP_SPACES (p, lim)</code>. Strictly
speaking, the call expands to a compound statement, which is a complete
statement with no need for a semicolon to end it. However, since it
looks like a function call, it minimizes confusion if you can use it
like a function call, writing a semicolon afterward, as in
<code>SKIP_SPACES (p, lim);</code>
<p>This can cause trouble before <code>else</code> statements, because the
semicolon is actually a null statement. Suppose you write
<pre class="smallexample"> if (*p != 0)
SKIP_SPACES (p, lim);
else ...
</pre>
<p class="noindent">The presence of two statements—the compound statement and a null
statement—in between the <code>if</code> condition and the <code>else</code>
makes invalid C code.
<p>The definition of the macro <code>SKIP_SPACES</code> can be altered to solve
this problem, using a <code>do ... while</code> statement. Here is how:
<pre class="smallexample"> #define SKIP_SPACES(p, limit) \
do { char *lim = (limit); \
while (p < lim) { \
if (*p++ != ' ') { \
p--; break; }}} \
while (0)
</pre>
<p>Now <code>SKIP_SPACES (p, lim);</code> expands into
<pre class="smallexample"> do {...} while (0);
</pre>
<p class="noindent">which is one statement. The loop executes exactly once; most compilers
generate no extra code for it.
<div class="node">
<a name="Duplication-of-Side-Effects"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Self_002dReferential-Macros">Self-Referential Macros</a>,
Previous: <a rel="previous" accesskey="p" href="#Swallowing-the-Semicolon">Swallowing the Semicolon</a>,
Up: <a rel="up" accesskey="u" href="#Macro-Pitfalls">Macro Pitfalls</a>
</div>
<h4 class="subsection">3.10.4 Duplication of Side Effects</h4>
<p><a name="index-side-effects-_0028in-macro-arguments_0029-76"></a><a name="index-unsafe-macros-77"></a>Many C programs define a macro <code>min</code>, for “minimum”, like this:
<pre class="smallexample"> #define min(X, Y) ((X) < (Y) ? (X) : (Y))
</pre>
<p>When you use this macro with an argument containing a side effect,
as shown here,
<pre class="smallexample"> next = min (x + y, foo (z));
</pre>
<p class="noindent">it expands as follows:
<pre class="smallexample"> next = ((x + y) < (foo (z)) ? (x + y) : (foo (z)));
</pre>
<p class="noindent">where <code>x + y</code> has been substituted for <code>X</code> and <code>foo (z)</code>
for <code>Y</code>.
<p>The function <code>foo</code> is used only once in the statement as it appears
in the program, but the expression <code>foo (z)</code> has been substituted
twice into the macro expansion. As a result, <code>foo</code> might be called
two times when the statement is executed. If it has side effects or if
it takes a long time to compute, the results might not be what you
intended. We say that <code>min</code> is an <dfn>unsafe</dfn> macro.
<p>The best solution to this problem is to define <code>min</code> in a way that
computes the value of <code>foo (z)</code> only once. The C language offers
no standard way to do this, but it can be done with GNU extensions as
follows:
<pre class="smallexample"> #define min(X, Y) \
({ typeof (X) x_ = (X); \
typeof (Y) y_ = (Y); \
(x_ < y_) ? x_ : y_; })
</pre>
<p>The ‘<samp><span class="samp">({ ... })</span></samp>’ notation produces a compound statement that
acts as an expression. Its value is the value of its last statement.
This permits us to define local variables and assign each argument to
one. The local variables have underscores after their names to reduce
the risk of conflict with an identifier of wider scope (it is impossible
to avoid this entirely). Now each argument is evaluated exactly once.
<p>If you do not wish to use GNU C extensions, the only solution is to be
careful when <em>using</em> the macro <code>min</code>. For example, you can
calculate the value of <code>foo (z)</code>, save it in a variable, and use
that variable in <code>min</code>:
<pre class="smallexample"> #define min(X, Y) ((X) < (Y) ? (X) : (Y))
...
{
int tem = foo (z);
next = min (x + y, tem);
}
</pre>
<p class="noindent">(where we assume that <code>foo</code> returns type <code>int</code>).
<div class="node">
<a name="Self-Referential-Macros"></a>
<a name="Self_002dReferential-Macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Argument-Prescan">Argument Prescan</a>,
Previous: <a rel="previous" accesskey="p" href="#Duplication-of-Side-Effects">Duplication of Side Effects</a>,
Up: <a rel="up" accesskey="u" href="#Macro-Pitfalls">Macro Pitfalls</a>
</div>
<h4 class="subsection">3.10.5 Self-Referential Macros</h4>
<p><a name="index-self_002dreference-78"></a>
A <dfn>self-referential</dfn> macro is one whose name appears in its
definition. Recall that all macro definitions are rescanned for more
macros to replace. If the self-reference were considered a use of the
macro, it would produce an infinitely large expansion. To prevent this,
the self-reference is not considered a macro call. It is passed into
the preprocessor output unchanged. Consider an example:
<pre class="smallexample"> #define foo (4 + foo)
</pre>
<p class="noindent">where <code>foo</code> is also a variable in your program.
<p>Following the ordinary rules, each reference to <code>foo</code> will expand
into <code>(4 + foo)</code>; then this will be rescanned and will expand into
<code>(4 + (4 + foo))</code>; and so on until the computer runs out of memory.
<p>The self-reference rule cuts this process short after one step, at
<code>(4 + foo)</code>. Therefore, this macro definition has the possibly
useful effect of causing the program to add 4 to the value of <code>foo</code>
wherever <code>foo</code> is referred to.
<p>In most cases, it is a bad idea to take advantage of this feature. A
person reading the program who sees that <code>foo</code> is a variable will
not expect that it is a macro as well. The reader will come across the
identifier <code>foo</code> in the program and think its value should be that
of the variable <code>foo</code>, whereas in fact the value is four greater.
<p>One common, useful use of self-reference is to create a macro which
expands to itself. If you write
<pre class="smallexample"> #define EPERM EPERM
</pre>
<p class="noindent">then the macro <code>EPERM</code> expands to <code>EPERM</code>. Effectively, it is
left alone by the preprocessor whenever it's used in running text. You
can tell that it's a macro with ‘<samp><span class="samp">#ifdef</span></samp>’. You might do this if you
want to define numeric constants with an <code>enum</code>, but have
‘<samp><span class="samp">#ifdef</span></samp>’ be true for each constant.
<p>If a macro <code>x</code> expands to use a macro <code>y</code>, and the expansion of
<code>y</code> refers to the macro <code>x</code>, that is an <dfn>indirect
self-reference</dfn> of <code>x</code>. <code>x</code> is not expanded in this case
either. Thus, if we have
<pre class="smallexample"> #define x (4 + y)
#define y (2 * x)
</pre>
<p class="noindent">then <code>x</code> and <code>y</code> expand as follows:
<pre class="smallexample"> x ==> (4 + y)
==> (4 + (2 * x))
y ==> (2 * x)
==> (2 * (4 + y))
</pre>
<p class="noindent">Each macro is expanded when it appears in the definition of the other
macro, but not when it indirectly appears in its own definition.
<div class="node">
<a name="Argument-Prescan"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Newlines-in-Arguments">Newlines in Arguments</a>,
Previous: <a rel="previous" accesskey="p" href="#Self_002dReferential-Macros">Self-Referential Macros</a>,
Up: <a rel="up" accesskey="u" href="#Macro-Pitfalls">Macro Pitfalls</a>
</div>
<h4 class="subsection">3.10.6 Argument Prescan</h4>
<p><a name="index-expansion-of-arguments-79"></a><a name="index-macro-argument-expansion-80"></a><a name="index-prescan-of-macro-arguments-81"></a>
Macro arguments are completely macro-expanded before they are
substituted into a macro body, unless they are stringified or pasted
with other tokens. After substitution, the entire macro body, including
the substituted arguments, is scanned again for macros to be expanded.
The result is that the arguments are scanned <em>twice</em> to expand
macro calls in them.
<p>Most of the time, this has no effect. If the argument contained any
macro calls, they are expanded during the first scan. The result
therefore contains no macro calls, so the second scan does not change
it. If the argument were substituted as given, with no prescan, the
single remaining scan would find the same macro calls and produce the
same results.
<p>You might expect the double scan to change the results when a
self-referential macro is used in an argument of another macro
(see <a href="#Self_002dReferential-Macros">Self-Referential Macros</a>): the self-referential macro would be
expanded once in the first scan, and a second time in the second scan.
However, this is not what happens. The self-references that do not
expand in the first scan are marked so that they will not expand in the
second scan either.
<p>You might wonder, “Why mention the prescan, if it makes no difference?
And why not skip it and make the preprocessor faster?” The answer is
that the prescan does make a difference in three special cases:
<ul>
<li>Nested calls to a macro.
<p>We say that <dfn>nested</dfn> calls to a macro occur when a macro's argument
contains a call to that very macro. For example, if <code>f</code> is a macro
that expects one argument, <code>f (f (1))</code> is a nested pair of calls to
<code>f</code>. The desired expansion is made by expanding <code>f (1)</code> and
substituting that into the definition of <code>f</code>. The prescan causes
the expected result to happen. Without the prescan, <code>f (1)</code> itself
would be substituted as an argument, and the inner use of <code>f</code> would
appear during the main scan as an indirect self-reference and would not
be expanded.
<li>Macros that call other macros that stringify or concatenate.
<p>If an argument is stringified or concatenated, the prescan does not
occur. If you <em>want</em> to expand a macro, then stringify or
concatenate its expansion, you can do that by causing one macro to call
another macro that does the stringification or concatenation. For
instance, if you have
<pre class="smallexample"> #define AFTERX(x) X_ ## x
#define XAFTERX(x) AFTERX(x)
#define TABLESIZE 1024
#define BUFSIZE TABLESIZE
</pre>
<p>then <code>AFTERX(BUFSIZE)</code> expands to <code>X_BUFSIZE</code>, and
<code>XAFTERX(BUFSIZE)</code> expands to <code>X_1024</code>. (Not to
<code>X_TABLESIZE</code>. Prescan always does a complete expansion.)
<li>Macros used in arguments, whose expansions contain unshielded commas.
<p>This can cause a macro expanded on the second scan to be called with the
wrong number of arguments. Here is an example:
<pre class="smallexample"> #define foo a,b
#define bar(x) lose(x)
#define lose(x) (1 + (x))
</pre>
<p>We would like <code>bar(foo)</code> to turn into <code>(1 + (foo))</code>, which
would then turn into <code>(1 + (a,b))</code>. Instead, <code>bar(foo)</code>
expands into <code>lose(a,b)</code>, and you get an error because <code>lose</code>
requires a single argument. In this case, the problem is easily solved
by the same parentheses that ought to be used to prevent misnesting of
arithmetic operations:
<pre class="smallexample"> #define foo (a,b)
<br>or<br>
#define bar(x) lose((x))
</pre>
<p>The extra pair of parentheses prevents the comma in <code>foo</code>'s
definition from being interpreted as an argument separator.
</ul>
<div class="node">
<a name="Newlines-in-Arguments"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#Argument-Prescan">Argument Prescan</a>,
Up: <a rel="up" accesskey="u" href="#Macro-Pitfalls">Macro Pitfalls</a>
</div>
<h4 class="subsection">3.10.7 Newlines in Arguments</h4>
<p><a name="index-newlines-in-macro-arguments-82"></a>
The invocation of a function-like macro can extend over many logical
lines. However, in the present implementation, the entire expansion
comes out on one line. Thus line numbers emitted by the compiler or
debugger refer to the line the invocation started on, which might be
different to the line containing the argument causing the problem.
<p>Here is an example illustrating this:
<pre class="smallexample"> #define ignore_second_arg(a,b,c) a; c
ignore_second_arg (foo (),
ignored (),
syntax error);
</pre>
<p class="noindent">The syntax error triggered by the tokens <code>syntax error</code> results in
an error message citing line three—the line of ignore_second_arg—
even though the problematic code comes from line five.
<p>We consider this a bug, and intend to fix it in the near future.
<div class="node">
<a name="Conditionals"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Diagnostics">Diagnostics</a>,
Previous: <a rel="previous" accesskey="p" href="#Macros">Macros</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">4 Conditionals</h2>
<p><a name="index-conditionals-83"></a>
A <dfn>conditional</dfn> is a directive that instructs the preprocessor to
select whether or not to include a chunk of code in the final token
stream passed to the compiler. Preprocessor conditionals can test
arithmetic expressions, or whether a name is defined as a macro, or both
simultaneously using the special <code>defined</code> operator.
<p>A conditional in the C preprocessor resembles in some ways an <code>if</code>
statement in C, but it is important to understand the difference between
them. The condition in an <code>if</code> statement is tested during the
execution of your program. Its purpose is to allow your program to
behave differently from run to run, depending on the data it is
operating on. The condition in a preprocessing conditional directive is
tested when your program is compiled. Its purpose is to allow different
code to be included in the program depending on the situation at the
time of compilation.
<p>However, the distinction is becoming less clear. Modern compilers often
do test <code>if</code> statements when a program is compiled, if their
conditions are known not to vary at run time, and eliminate code which
can never be executed. If you can count on your compiler to do this,
you may find that your program is more readable if you use <code>if</code>
statements with constant conditions (perhaps determined by macros). Of
course, you can only use this to exclude code, not type definitions or
other preprocessing directives, and you can only do it if the code
remains syntactically valid when it is not to be used.
<p>GCC version 3 eliminates this kind of never-executed code even when
not optimizing. Older versions did it only when optimizing.
<ul class="menu">
<li><a accesskey="1" href="#Conditional-Uses">Conditional Uses</a>
<li><a accesskey="2" href="#Conditional-Syntax">Conditional Syntax</a>
<li><a accesskey="3" href="#Deleted-Code">Deleted Code</a>
</ul>
<div class="node">
<a name="Conditional-Uses"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Conditional-Syntax">Conditional Syntax</a>,
Up: <a rel="up" accesskey="u" href="#Conditionals">Conditionals</a>
</div>
<h3 class="section">4.1 Conditional Uses</h3>
<p>There are three general reasons to use a conditional.
<ul>
<li>A program may need to use different code depending on the machine or
operating system it is to run on. In some cases the code for one
operating system may be erroneous on another operating system; for
example, it might refer to data types or constants that do not exist on
the other system. When this happens, it is not enough to avoid
executing the invalid code. Its mere presence will cause the compiler
to reject the program. With a preprocessing conditional, the offending
code can be effectively excised from the program when it is not valid.
<li>You may want to be able to compile the same source file into two
different programs. One version might make frequent time-consuming
consistency checks on its intermediate data, or print the values of
those data for debugging, and the other not.
<li>A conditional whose condition is always false is one way to exclude code
from the program but keep it as a sort of comment for future reference.
</ul>
<p>Simple programs that do not need system-specific logic or complex
debugging hooks generally will not need to use preprocessing
conditionals.
<div class="node">
<a name="Conditional-Syntax"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Deleted-Code">Deleted Code</a>,
Previous: <a rel="previous" accesskey="p" href="#Conditional-Uses">Conditional Uses</a>,
Up: <a rel="up" accesskey="u" href="#Conditionals">Conditionals</a>
</div>
<h3 class="section">4.2 Conditional Syntax</h3>
<p><a name="index-g_t_0023if-84"></a>A conditional in the C preprocessor begins with a <dfn>conditional
directive</dfn>: ‘<samp><span class="samp">#if</span></samp>’, ‘<samp><span class="samp">#ifdef</span></samp>’ or ‘<samp><span class="samp">#ifndef</span></samp>’.
<ul class="menu">
<li><a accesskey="1" href="#Ifdef">Ifdef</a>
<li><a accesskey="2" href="#If">If</a>
<li><a accesskey="3" href="#Defined">Defined</a>
<li><a accesskey="4" href="#Else">Else</a>
<li><a accesskey="5" href="#Elif">Elif</a>
</ul>
<div class="node">
<a name="Ifdef"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#If">If</a>,
Up: <a rel="up" accesskey="u" href="#Conditional-Syntax">Conditional Syntax</a>
</div>
<h4 class="subsection">4.2.1 Ifdef</h4>
<p><a name="index-g_t_0023ifdef-85"></a><a name="index-g_t_0023endif-86"></a>
The simplest sort of conditional is
<pre class="smallexample"> #ifdef <var>MACRO</var>
<var>controlled text</var>
#endif /* <var>MACRO</var> */
</pre>
<p><a name="index-conditional-group-87"></a>This block is called a <dfn>conditional group</dfn>. <var>controlled text</var>
will be included in the output of the preprocessor if and only if
<var>MACRO</var> is defined. We say that the conditional <dfn>succeeds</dfn> if
<var>MACRO</var> is defined, <dfn>fails</dfn> if it is not.
<p>The <var>controlled text</var> inside of a conditional can include
preprocessing directives. They are executed only if the conditional
succeeds. You can nest conditional groups inside other conditional
groups, but they must be completely nested. In other words,
‘<samp><span class="samp">#endif</span></samp>’ always matches the nearest ‘<samp><span class="samp">#ifdef</span></samp>’ (or
‘<samp><span class="samp">#ifndef</span></samp>’, or ‘<samp><span class="samp">#if</span></samp>’). Also, you cannot start a conditional
group in one file and end it in another.
<p>Even if a conditional fails, the <var>controlled text</var> inside it is
still run through initial transformations and tokenization. Therefore,
it must all be lexically valid C. Normally the only way this matters is
that all comments and string literals inside a failing conditional group
must still be properly ended.
<p>The comment following the ‘<samp><span class="samp">#endif</span></samp>’ is not required, but it is a
good practice if there is a lot of <var>controlled text</var>, because it
helps people match the ‘<samp><span class="samp">#endif</span></samp>’ to the corresponding ‘<samp><span class="samp">#ifdef</span></samp>’.
Older programs sometimes put <var>MACRO</var> directly after the
‘<samp><span class="samp">#endif</span></samp>’ without enclosing it in a comment. This is invalid code
according to the C standard. CPP accepts it with a warning. It
never affects which ‘<samp><span class="samp">#ifndef</span></samp>’ the ‘<samp><span class="samp">#endif</span></samp>’ matches.
<p><a name="index-g_t_0023ifndef-88"></a>Sometimes you wish to use some code if a macro is <em>not</em> defined.
You can do this by writing ‘<samp><span class="samp">#ifndef</span></samp>’ instead of ‘<samp><span class="samp">#ifdef</span></samp>’.
One common use of ‘<samp><span class="samp">#ifndef</span></samp>’ is to include code only the first
time a header file is included. See <a href="#Once_002dOnly-Headers">Once-Only Headers</a>.
<p>Macro definitions can vary between compilations for several reasons.
Here are some samples.
<ul>
<li>Some macros are predefined on each kind of machine
(see <a href="#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>). This allows you to provide
code specially tuned for a particular machine.
<li>System header files define more macros, associated with the features
they implement. You can test these macros with conditionals to avoid
using a system feature on a machine where it is not implemented.
<li>Macros can be defined or undefined with the <samp><span class="option">-D</span></samp> and <samp><span class="option">-U</span></samp>
command line options when you compile the program. You can arrange to
compile the same source file into two different programs by choosing a
macro name to specify which program you want, writing conditionals to
test whether or how this macro is defined, and then controlling the
state of the macro with command line options, perhaps set in the
Makefile. See <a href="#Invocation">Invocation</a>.
<li>Your program might have a special header file (often called
<samp><span class="file">config.h</span></samp>) that is adjusted when the program is compiled. It can
define or not define macros depending on the features of the system and
the desired capabilities of the program. The adjustment can be
automated by a tool such as <samp><span class="command">autoconf</span></samp>, or done by hand.
</ul>
<div class="node">
<a name="If"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Defined">Defined</a>,
Previous: <a rel="previous" accesskey="p" href="#Ifdef">Ifdef</a>,
Up: <a rel="up" accesskey="u" href="#Conditional-Syntax">Conditional Syntax</a>
</div>
<h4 class="subsection">4.2.2 If</h4>
<p>The ‘<samp><span class="samp">#if</span></samp>’ directive allows you to test the value of an arithmetic
expression, rather than the mere existence of one macro. Its syntax is
<pre class="smallexample"> #if <var>expression</var>
<var>controlled text</var>
#endif /* <var>expression</var> */
</pre>
<p><var>expression</var> is a C expression of integer type, subject to stringent
restrictions. It may contain
<ul>
<li>Integer constants.
<li>Character constants, which are interpreted as they would be in normal
code.
<li>Arithmetic operators for addition, subtraction, multiplication,
division, bitwise operations, shifts, comparisons, and logical
operations (<code>&&</code> and <code>||</code>). The latter two obey the usual
short-circuiting rules of standard C.
<li>Macros. All macros in the expression are expanded before actual
computation of the expression's value begins.
<li>Uses of the <code>defined</code> operator, which lets you check whether macros
are defined in the middle of an ‘<samp><span class="samp">#if</span></samp>’.
<li>Identifiers that are not macros, which are all considered to be the
number zero. This allows you to write <code>#if MACRO<!-- /@w --></code> instead of
<code>#ifdef MACRO<!-- /@w --></code>, if you know that MACRO, when defined, will
always have a nonzero value. Function-like macros used without their
function call parentheses are also treated as zero.
<p>In some contexts this shortcut is undesirable. The <samp><span class="option">-Wundef</span></samp>
option causes GCC to warn whenever it encounters an identifier which is
not a macro in an ‘<samp><span class="samp">#if</span></samp>’.
</ul>
<p>The preprocessor does not know anything about types in the language.
Therefore, <code>sizeof</code> operators are not recognized in ‘<samp><span class="samp">#if</span></samp>’, and
neither are <code>enum</code> constants. They will be taken as identifiers
which are not macros, and replaced by zero. In the case of
<code>sizeof</code>, this is likely to cause the expression to be invalid.
<p>The preprocessor calculates the value of <var>expression</var>. It carries
out all calculations in the widest integer type known to the compiler;
on most machines supported by GCC this is 64 bits. This is not the same
rule as the compiler uses to calculate the value of a constant
expression, and may give different results in some cases. If the value
comes out to be nonzero, the ‘<samp><span class="samp">#if</span></samp>’ succeeds and the <var>controlled
text</var> is included; otherwise it is skipped.
<div class="node">
<a name="Defined"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Else">Else</a>,
Previous: <a rel="previous" accesskey="p" href="#If">If</a>,
Up: <a rel="up" accesskey="u" href="#Conditional-Syntax">Conditional Syntax</a>
</div>
<h4 class="subsection">4.2.3 Defined</h4>
<p><a name="index-g_t_0040code_007bdefined_007d-89"></a>The special operator <code>defined</code> is used in ‘<samp><span class="samp">#if</span></samp>’ and
‘<samp><span class="samp">#elif</span></samp>’ expressions to test whether a certain name is defined as a
macro. <code>defined </code><var>name</var> and <code>defined (</code><var>name</var><code>)</code> are
both expressions whose value is 1 if <var>name</var> is defined as a macro at
the current point in the program, and 0 otherwise. Thus, <code>#if defined MACRO<!-- /@w --></code> is precisely equivalent to <code>#ifdef MACRO<!-- /@w --></code>.
<p><code>defined</code> is useful when you wish to test more than one macro for
existence at once. For example,
<pre class="smallexample"> #if defined (__vax__) || defined (__ns16000__)
</pre>
<p class="noindent">would succeed if either of the names <code>__vax__</code> or
<code>__ns16000__</code> is defined as a macro.
<p>Conditionals written like this:
<pre class="smallexample"> #if defined BUFSIZE && BUFSIZE >= 1024
</pre>
<p class="noindent">can generally be simplified to just <code>#if BUFSIZE >= 1024<!-- /@w --></code>,
since if <code>BUFSIZE</code> is not defined, it will be interpreted as having
the value zero.
<p>If the <code>defined</code> operator appears as a result of a macro expansion,
the C standard says the behavior is undefined. GNU cpp treats it as a
genuine <code>defined</code> operator and evaluates it normally. It will warn
wherever your code uses this feature if you use the command-line option
<samp><span class="option">-pedantic</span></samp>, since other compilers may handle it differently.
<div class="node">
<a name="Else"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Elif">Elif</a>,
Previous: <a rel="previous" accesskey="p" href="#Defined">Defined</a>,
Up: <a rel="up" accesskey="u" href="#Conditional-Syntax">Conditional Syntax</a>
</div>
<h4 class="subsection">4.2.4 Else</h4>
<p><a name="index-g_t_0023else-90"></a>The ‘<samp><span class="samp">#else</span></samp>’ directive can be added to a conditional to provide
alternative text to be used if the condition fails. This is what it
looks like:
<pre class="smallexample"> #if <var>expression</var>
<var>text-if-true</var>
#else /* Not <var>expression</var> */
<var>text-if-false</var>
#endif /* Not <var>expression</var> */
</pre>
<p class="noindent">If <var>expression</var> is nonzero, the <var>text-if-true</var> is included and
the <var>text-if-false</var> is skipped. If <var>expression</var> is zero, the
opposite happens.
<p>You can use ‘<samp><span class="samp">#else</span></samp>’ with ‘<samp><span class="samp">#ifdef</span></samp>’ and ‘<samp><span class="samp">#ifndef</span></samp>’, too.
<div class="node">
<a name="Elif"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#Else">Else</a>,
Up: <a rel="up" accesskey="u" href="#Conditional-Syntax">Conditional Syntax</a>
</div>
<h4 class="subsection">4.2.5 Elif</h4>
<p><a name="index-g_t_0023elif-91"></a>One common case of nested conditionals is used to check for more than two
possible alternatives. For example, you might have
<pre class="smallexample"> #if X == 1
...
#else /* X != 1 */
#if X == 2
...
#else /* X != 2 */
...
#endif /* X != 2 */
#endif /* X != 1 */
</pre>
<p>Another conditional directive, ‘<samp><span class="samp">#elif</span></samp>’, allows this to be
abbreviated as follows:
<pre class="smallexample"> #if X == 1
...
#elif X == 2
...
#else /* X != 2 and X != 1*/
...
#endif /* X != 2 and X != 1*/
</pre>
<p>‘<samp><span class="samp">#elif</span></samp>’ stands for “else if”. Like ‘<samp><span class="samp">#else</span></samp>’, it goes in the
middle of a conditional group and subdivides it; it does not require a
matching ‘<samp><span class="samp">#endif</span></samp>’ of its own. Like ‘<samp><span class="samp">#if</span></samp>’, the ‘<samp><span class="samp">#elif</span></samp>’
directive includes an expression to be tested. The text following the
‘<samp><span class="samp">#elif</span></samp>’ is processed only if the original ‘<samp><span class="samp">#if</span></samp>’-condition
failed and the ‘<samp><span class="samp">#elif</span></samp>’ condition succeeds.
<p>More than one ‘<samp><span class="samp">#elif</span></samp>’ can go in the same conditional group. Then
the text after each ‘<samp><span class="samp">#elif</span></samp>’ is processed only if the ‘<samp><span class="samp">#elif</span></samp>’
condition succeeds after the original ‘<samp><span class="samp">#if</span></samp>’ and all previous
‘<samp><span class="samp">#elif</span></samp>’ directives within it have failed.
<p>‘<samp><span class="samp">#else</span></samp>’ is allowed after any number of ‘<samp><span class="samp">#elif</span></samp>’ directives, but
‘<samp><span class="samp">#elif</span></samp>’ may not follow ‘<samp><span class="samp">#else</span></samp>’.
<div class="node">
<a name="Deleted-Code"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#Conditional-Syntax">Conditional Syntax</a>,
Up: <a rel="up" accesskey="u" href="#Conditionals">Conditionals</a>
</div>
<h3 class="section">4.3 Deleted Code</h3>
<p><a name="index-commenting-out-code-92"></a>
If you replace or delete a part of the program but want to keep the old
code around for future reference, you often cannot simply comment it
out. Block comments do not nest, so the first comment inside the old
code will end the commenting-out. The probable result is a flood of
syntax errors.
<p>One way to avoid this problem is to use an always-false conditional
instead. For instance, put <code>#if 0</code> before the deleted code and
<code>#endif</code> after it. This works even if the code being turned
off contains conditionals, but they must be entire conditionals
(balanced ‘<samp><span class="samp">#if</span></samp>’ and ‘<samp><span class="samp">#endif</span></samp>’).
<p>Some people use <code>#ifdef notdef</code> instead. This is risky, because
<code>notdef</code> might be accidentally defined as a macro, and then the
conditional would succeed. <code>#if 0</code> can be counted on to fail.
<p>Do not use <code>#if 0</code> for comments which are not C code. Use a real
comment, instead. The interior of <code>#if 0</code> must consist of complete
tokens; in particular, single-quote characters must balance. Comments
often contain unbalanced single-quote characters (known in English as
apostrophes). These confuse <code>#if 0</code>. They don't confuse
‘<samp><span class="samp">/*</span></samp>’.
<div class="node">
<a name="Diagnostics"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Line-Control">Line Control</a>,
Previous: <a rel="previous" accesskey="p" href="#Conditionals">Conditionals</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">5 Diagnostics</h2>
<p><a name="index-diagnostic-93"></a><a name="index-reporting-errors-94"></a><a name="index-reporting-warnings-95"></a>
<a name="index-g_t_0023error-96"></a>The directive ‘<samp><span class="samp">#error</span></samp>’ causes the preprocessor to report a fatal
error. The tokens forming the rest of the line following ‘<samp><span class="samp">#error</span></samp>’
are used as the error message.
<p>You would use ‘<samp><span class="samp">#error</span></samp>’ inside of a conditional that detects a
combination of parameters which you know the program does not properly
support. For example, if you know that the program will not run
properly on a VAX, you might write
<pre class="smallexample"> #ifdef __vax__
#error "Won't work on VAXen. See comments at get_last_object."
#endif
</pre>
<p>If you have several configuration parameters that must be set up by
the installation in a consistent way, you can use conditionals to detect
an inconsistency and report it with ‘<samp><span class="samp">#error</span></samp>’. For example,
<pre class="smallexample"> #if !defined(UNALIGNED_INT_ASM_OP) && defined(DWARF2_DEBUGGING_INFO)
#error "DWARF2_DEBUGGING_INFO requires UNALIGNED_INT_ASM_OP."
#endif
</pre>
<p><a name="index-g_t_0023warning-97"></a>The directive ‘<samp><span class="samp">#warning</span></samp>’ is like ‘<samp><span class="samp">#error</span></samp>’, but causes the
preprocessor to issue a warning and continue preprocessing. The tokens
following ‘<samp><span class="samp">#warning</span></samp>’ are used as the warning message.
<p>You might use ‘<samp><span class="samp">#warning</span></samp>’ in obsolete header files, with a message
directing the user to the header file which should be used instead.
<p>Neither ‘<samp><span class="samp">#error</span></samp>’ nor ‘<samp><span class="samp">#warning</span></samp>’ macro-expands its argument.
Internal whitespace sequences are each replaced with a single space.
The line must consist of complete tokens. It is wisest to make the
argument of these directives be a single string constant; this avoids
problems with apostrophes and the like.
<div class="node">
<a name="Line-Control"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Pragmas">Pragmas</a>,
Previous: <a rel="previous" accesskey="p" href="#Diagnostics">Diagnostics</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">6 Line Control</h2>
<p><a name="index-line-control-98"></a>
The C preprocessor informs the C compiler of the location in your source
code where each token came from. Presently, this is just the file name
and line number. All the tokens resulting from macro expansion are
reported as having appeared on the line of the source file where the
outermost macro was used. We intend to be more accurate in the future.
<p>If you write a program which generates source code, such as the
<samp><span class="command">bison</span></samp> parser generator, you may want to adjust the preprocessor's
notion of the current file name and line number by hand. Parts of the
output from <samp><span class="command">bison</span></samp> are generated from scratch, other parts come
from a standard parser file. The rest are copied verbatim from
<samp><span class="command">bison</span></samp>'s input. You would like compiler error messages and
symbolic debuggers to be able to refer to <code>bison</code>'s input file.
<p><a name="index-g_t_0023line-99"></a><samp><span class="command">bison</span></samp> or any such program can arrange this by writing
‘<samp><span class="samp">#line</span></samp>’ directives into the output file. ‘<samp><span class="samp">#line</span></samp>’ is a
directive that specifies the original line number and source file name
for subsequent input in the current preprocessor input file.
‘<samp><span class="samp">#line</span></samp>’ has three variants:
<dl>
<dt><code>#line </code><var>linenum</var><dd><var>linenum</var> is a non-negative decimal integer constant. It specifies
the line number which should be reported for the following line of
input. Subsequent lines are counted from <var>linenum</var>.
<br><dt><code>#line </code><var>linenum</var> <var>filename</var><dd><var>linenum</var> is the same as for the first form, and has the same
effect. In addition, <var>filename</var> is a string constant. The
following line and all subsequent lines are reported to come from the
file it specifies, until something else happens to change that.
<var>filename</var> is interpreted according to the normal rules for a string
constant: backslash escapes are interpreted. This is different from
‘<samp><span class="samp">#include</span></samp>’.
<p>Previous versions of CPP did not interpret escapes in ‘<samp><span class="samp">#line</span></samp>’;
we have changed it because the standard requires they be interpreted,
and most other compilers do.
<br><dt><code>#line </code><var>anything else</var><dd><var>anything else</var> is checked for macro calls, which are expanded.
The result should match one of the above two forms.
</dl>
<p>‘<samp><span class="samp">#line</span></samp>’ directives alter the results of the <code>__FILE__</code> and
<code>__LINE__</code> predefined macros from that point on. See <a href="#Standard-Predefined-Macros">Standard Predefined Macros</a>. They do not have any effect on ‘<samp><span class="samp">#include</span></samp>’'s
idea of the directory containing the current file. This is a change
from GCC 2.95. Previously, a file reading
<pre class="smallexample"> #line 1 "../src/gram.y"
#include "gram.h"
</pre>
<p>would search for <samp><span class="file">gram.h</span></samp> in <samp><span class="file">../src</span></samp>, then the <samp><span class="option">-I</span></samp>
chain; the directory containing the physical source file would not be
searched. In GCC 3.0 and later, the ‘<samp><span class="samp">#include</span></samp>’ is not affected by
the presence of a ‘<samp><span class="samp">#line</span></samp>’ referring to a different directory.
<p>We made this change because the old behavior caused problems when
generated source files were transported between machines. For instance,
it is common practice to ship generated parsers with a source release,
so that people building the distribution do not need to have yacc or
Bison installed. These files frequently have ‘<samp><span class="samp">#line</span></samp>’ directives
referring to the directory tree of the system where the distribution was
created. If GCC tries to search for headers in those directories, the
build is likely to fail.
<p>The new behavior can cause failures too, if the generated file is not
in the same directory as its source and it attempts to include a header
which would be visible searching from the directory containing the
source file. However, this problem is easily solved with an additional
<samp><span class="option">-I</span></samp> switch on the command line. The failures caused by the old
semantics could sometimes be corrected only by editing the generated
files, which is difficult and error-prone.
<div class="node">
<a name="Pragmas"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Other-Directives">Other Directives</a>,
Previous: <a rel="previous" accesskey="p" href="#Line-Control">Line Control</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">7 Pragmas</h2>
<p>The ‘<samp><span class="samp">#pragma</span></samp>’ directive is the method specified by the C standard
for providing additional information to the compiler, beyond what is
conveyed in the language itself. Three forms of this directive
(commonly known as <dfn>pragmas</dfn>) are specified by the 1999 C standard.
A C compiler is free to attach any meaning it likes to other pragmas.
<p>GCC has historically preferred to use extensions to the syntax of the
language, such as <code>__attribute__</code>, for this purpose. However, GCC
does define a few pragmas of its own. These mostly have effects on the
entire translation unit or source file.
<p>In GCC version 3, all GNU-defined, supported pragmas have been given a
<code>GCC</code> prefix. This is in line with the <code>STDC</code> prefix on all
pragmas defined by C99. For backward compatibility, pragmas which were
recognized by previous versions are still recognized without the
<code>GCC</code> prefix, but that usage is deprecated. Some older pragmas are
deprecated in their entirety. They are not recognized with the
<code>GCC</code> prefix. See <a href="#Obsolete-Features">Obsolete Features</a>.
<p><a name="index-g_t_0040code_007b_005fPragma_007d-100"></a>C99 introduces the <code>_Pragma<!-- /@w --></code> operator. This feature addresses a
major problem with ‘<samp><span class="samp">#pragma</span></samp>’: being a directive, it cannot be
produced as the result of macro expansion. <code>_Pragma<!-- /@w --></code> is an
operator, much like <code>sizeof</code> or <code>defined</code>, and can be embedded
in a macro.
<p>Its syntax is <code>_Pragma (</code><var>string-literal</var><code>)<!-- /@w --></code>, where
<var>string-literal</var> can be either a normal or wide-character string
literal. It is destringized, by replacing all ‘<samp><span class="samp">\\</span></samp>’ with a single
‘<samp><span class="samp">\</span></samp>’ and all ‘<samp><span class="samp">\"</span></samp>’ with a ‘<samp><span class="samp">"</span></samp>’. The result is then
processed as if it had appeared as the right hand side of a
‘<samp><span class="samp">#pragma</span></samp>’ directive. For example,
<pre class="smallexample"> _Pragma ("GCC dependency \"parse.y\"")
</pre>
<p class="noindent">has the same effect as <code>#pragma GCC dependency "parse.y"</code>. The
same effect could be achieved using macros, for example
<pre class="smallexample"> #define DO_PRAGMA(x) _Pragma (#x)
DO_PRAGMA (GCC dependency "parse.y")
</pre>
<p>The standard is unclear on where a <code>_Pragma</code> operator can appear.
The preprocessor does not accept it within a preprocessing conditional
directive like ‘<samp><span class="samp">#if</span></samp>’. To be safe, you are probably best keeping it
out of directives other than ‘<samp><span class="samp">#define</span></samp>’, and putting it on a line of
its own.
<p>This manual documents the pragmas which are meaningful to the
preprocessor itself. Other pragmas are meaningful to the C or C++
compilers. They are documented in the GCC manual.
<p>GCC plugins may provide their own pragmas.
<dl>
<dt><code>#pragma GCC dependency</code><a name="index-g_t_0023pragma-GCC-dependency-101"></a><dd><code>#pragma GCC dependency</code> allows you to check the relative dates of
the current file and another file. If the other file is more recent than
the current file, a warning is issued. This is useful if the current
file is derived from the other file, and should be regenerated. The
other file is searched for using the normal include search path.
Optional trailing text can be used to give more information in the
warning message.
<pre class="smallexample"> #pragma GCC dependency "parse.y"
#pragma GCC dependency "/usr/include/time.h" rerun fixincludes
</pre>
<br><dt><code>#pragma GCC poison</code><a name="index-g_t_0023pragma-GCC-poison-102"></a><dd>Sometimes, there is an identifier that you want to remove completely
from your program, and make sure that it never creeps back in. To
enforce this, you can <dfn>poison</dfn> the identifier with this pragma.
<code>#pragma GCC poison</code> is followed by a list of identifiers to
poison. If any of those identifiers appears anywhere in the source
after the directive, it is a hard error. For example,
<pre class="smallexample"> #pragma GCC poison printf sprintf fprintf
sprintf(some_string, "hello");
</pre>
<p class="noindent">will produce an error.
<p>If a poisoned identifier appears as part of the expansion of a macro
which was defined before the identifier was poisoned, it will <em>not</em>
cause an error. This lets you poison an identifier without worrying
about system headers defining macros that use it.
<p>For example,
<pre class="smallexample"> #define strrchr rindex
#pragma GCC poison rindex
strrchr(some_string, 'h');
</pre>
<p class="noindent">will not produce an error.
<br><dt><code>#pragma GCC system_header</code><a name="index-g_t_0023pragma-GCC-system_005fheader-103"></a><dd>This pragma takes no arguments. It causes the rest of the code in the
current file to be treated as if it came from a system header.
See <a href="#System-Headers">System Headers</a>.
</dl>
<div class="node">
<a name="Other-Directives"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Preprocessor-Output">Preprocessor Output</a>,
Previous: <a rel="previous" accesskey="p" href="#Pragmas">Pragmas</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">8 Other Directives</h2>
<p><a name="index-g_t_0023ident-104"></a><a name="index-g_t_0023sccs-105"></a>The ‘<samp><span class="samp">#ident</span></samp>’ directive takes one argument, a string constant. On
some systems, that string constant is copied into a special segment of
the object file. On other systems, the directive is ignored. The
‘<samp><span class="samp">#sccs</span></samp>’ directive is a synonym for ‘<samp><span class="samp">#ident</span></samp>’.
<p>These directives are not part of the C standard, but they are not
official GNU extensions either. What historical information we have
been able to find, suggests they originated with System V.
<p><a name="index-null-directive-106"></a>The <dfn>null directive</dfn> consists of a ‘<samp><span class="samp">#</span></samp>’ followed by a newline,
with only whitespace (including comments) in between. A null directive
is understood as a preprocessing directive but has no effect on the
preprocessor output. The primary significance of the existence of the
null directive is that an input line consisting of just a ‘<samp><span class="samp">#</span></samp>’ will
produce no output, rather than a line of output containing just a
‘<samp><span class="samp">#</span></samp>’. Supposedly some old C programs contain such lines.
<div class="node">
<a name="Preprocessor-Output"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Traditional-Mode">Traditional Mode</a>,
Previous: <a rel="previous" accesskey="p" href="#Other-Directives">Other Directives</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">9 Preprocessor Output</h2>
<p>When the C preprocessor is used with the C, C++, or Objective-C
compilers, it is integrated into the compiler and communicates a stream
of binary tokens directly to the compiler's parser. However, it can
also be used in the more conventional standalone mode, where it produces
textual output.
<!-- FIXME: Document the library interface. -->
<p><a name="index-output-format-107"></a>The output from the C preprocessor looks much like the input, except
that all preprocessing directive lines have been replaced with blank
lines and all comments with spaces. Long runs of blank lines are
discarded.
<p>The ISO standard specifies that it is implementation defined whether a
preprocessor preserves whitespace between tokens, or replaces it with
e.g. a single space. In GNU CPP, whitespace between tokens is collapsed
to become a single space, with the exception that the first token on a
non-directive line is preceded with sufficient spaces that it appears in
the same column in the preprocessed output that it appeared in the
original source file. This is so the output is easy to read.
See <a href="#Differences-from-previous-versions">Differences from previous versions</a>. CPP does not insert any
whitespace where there was none in the original source, except where
necessary to prevent an accidental token paste.
<p><a name="index-linemarkers-108"></a>Source file name and line number information is conveyed by lines
of the form
<pre class="smallexample"> # <var>linenum</var> <var>filename</var> <var>flags</var>
</pre>
<p class="noindent">These are called <dfn>linemarkers</dfn>. They are inserted as needed into
the output (but never within a string or character constant). They mean
that the following line originated in file <var>filename</var> at line
<var>linenum</var>. <var>filename</var> will never contain any non-printing
characters; they are replaced with octal escape sequences.
<p>After the file name comes zero or more flags, which are ‘<samp><span class="samp">1</span></samp>’,
‘<samp><span class="samp">2</span></samp>’, ‘<samp><span class="samp">3</span></samp>’, or ‘<samp><span class="samp">4</span></samp>’. If there are multiple flags, spaces
separate them. Here is what the flags mean:
<dl>
<dt>‘<samp><span class="samp">1</span></samp>’<dd>This indicates the start of a new file.
<br><dt>‘<samp><span class="samp">2</span></samp>’<dd>This indicates returning to a file (after having included another file).
<br><dt>‘<samp><span class="samp">3</span></samp>’<dd>This indicates that the following text comes from a system header file,
so certain warnings should be suppressed.
<br><dt>‘<samp><span class="samp">4</span></samp>’<dd>This indicates that the following text should be treated as being
wrapped in an implicit <code>extern "C"</code> block.
<!-- maybe cross reference NO_IMPLICIT_EXTERN_C -->
</dl>
<p>As an extension, the preprocessor accepts linemarkers in non-assembler
input files. They are treated like the corresponding ‘<samp><span class="samp">#line</span></samp>’
directive, (see <a href="#Line-Control">Line Control</a>), except that trailing flags are
permitted, and are interpreted with the meanings described above. If
multiple flags are given, they must be in ascending order.
<p>Some directives may be duplicated in the output of the preprocessor.
These are ‘<samp><span class="samp">#ident</span></samp>’ (always), ‘<samp><span class="samp">#pragma</span></samp>’ (only if the
preprocessor does not handle the pragma itself), and ‘<samp><span class="samp">#define</span></samp>’ and
‘<samp><span class="samp">#undef</span></samp>’ (with certain debugging options). If this happens, the
‘<samp><span class="samp">#</span></samp>’ of the directive will always be in the first column, and there
will be no space between the ‘<samp><span class="samp">#</span></samp>’ and the directive name. If macro
expansion happens to generate tokens which might be mistaken for a
duplicated directive, a space will be inserted between the ‘<samp><span class="samp">#</span></samp>’ and
the directive name.
<div class="node">
<a name="Traditional-Mode"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Implementation-Details">Implementation Details</a>,
Previous: <a rel="previous" accesskey="p" href="#Preprocessor-Output">Preprocessor Output</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">10 Traditional Mode</h2>
<p>Traditional (pre-standard) C preprocessing is rather different from
the preprocessing specified by the standard. When GCC is given the
<samp><span class="option">-traditional-cpp</span></samp> option, it attempts to emulate a traditional
preprocessor.
<p>GCC versions 3.2 and later only support traditional mode semantics in
the preprocessor, and not in the compiler front ends. This chapter
outlines the traditional preprocessor semantics we implemented.
<p>The implementation does not correspond precisely to the behavior of
earlier versions of GCC, nor to any true traditional preprocessor.
After all, inconsistencies among traditional implementations were a
major motivation for C standardization. However, we intend that it
should be compatible with true traditional preprocessors in all ways
that actually matter.
<ul class="menu">
<li><a accesskey="1" href="#Traditional-lexical-analysis">Traditional lexical analysis</a>
<li><a accesskey="2" href="#Traditional-macros">Traditional macros</a>
<li><a accesskey="3" href="#Traditional-miscellany">Traditional miscellany</a>
<li><a accesskey="4" href="#Traditional-warnings">Traditional warnings</a>
</ul>
<div class="node">
<a name="Traditional-lexical-analysis"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Traditional-macros">Traditional macros</a>,
Up: <a rel="up" accesskey="u" href="#Traditional-Mode">Traditional Mode</a>
</div>
<h3 class="section">10.1 Traditional lexical analysis</h3>
<p>The traditional preprocessor does not decompose its input into tokens
the same way a standards-conforming preprocessor does. The input is
simply treated as a stream of text with minimal internal form.
<p>This implementation does not treat trigraphs (see <a href="#trigraphs">trigraphs</a>)
specially since they were an invention of the standards committee. It
handles arbitrarily-positioned escaped newlines properly and splices
the lines as you would expect; many traditional preprocessors did not
do this.
<p>The form of horizontal whitespace in the input file is preserved in
the output. In particular, hard tabs remain hard tabs. This can be
useful if, for example, you are preprocessing a Makefile.
<p>Traditional CPP only recognizes C-style block comments, and treats the
‘<samp><span class="samp">/*</span></samp>’ sequence as introducing a comment only if it lies outside
quoted text. Quoted text is introduced by the usual single and double
quotes, and also by an initial ‘<samp><span class="samp"><</span></samp>’ in a <code>#include</code>
directive.
<p>Traditionally, comments are completely removed and are not replaced
with a space. Since a traditional compiler does its own tokenization
of the output of the preprocessor, this means that comments can
effectively be used as token paste operators. However, comments
behave like separators for text handled by the preprocessor itself,
since it doesn't re-lex its input. For example, in
<pre class="smallexample"> #if foo/**/bar
</pre>
<p class="noindent">‘<samp><span class="samp">foo</span></samp>’ and ‘<samp><span class="samp">bar</span></samp>’ are distinct identifiers and expanded
separately if they happen to be macros. In other words, this
directive is equivalent to
<pre class="smallexample"> #if foo bar
</pre>
<p class="noindent">rather than
<pre class="smallexample"> #if foobar
</pre>
<p>Generally speaking, in traditional mode an opening quote need not have
a matching closing quote. In particular, a macro may be defined with
replacement text that contains an unmatched quote. Of course, if you
attempt to compile preprocessed output containing an unmatched quote
you will get a syntax error.
<p>However, all preprocessing directives other than <code>#define</code>
require matching quotes. For example:
<pre class="smallexample"> #define m This macro's fine and has an unmatched quote
"/* This is not a comment. */
/* <span class="roman">This is a comment. The following #include directive
is ill-formed.</span> */
#include <stdio.h
</pre>
<p>Just as for the ISO preprocessor, what would be a closing quote can be
escaped with a backslash to prevent the quoted text from closing.
<div class="node">
<a name="Traditional-macros"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Traditional-miscellany">Traditional miscellany</a>,
Previous: <a rel="previous" accesskey="p" href="#Traditional-lexical-analysis">Traditional lexical analysis</a>,
Up: <a rel="up" accesskey="u" href="#Traditional-Mode">Traditional Mode</a>
</div>
<h3 class="section">10.2 Traditional macros</h3>
<p>The major difference between traditional and ISO macros is that the
former expand to text rather than to a token sequence. CPP removes
all leading and trailing horizontal whitespace from a macro's
replacement text before storing it, but preserves the form of internal
whitespace.
<p>One consequence is that it is legitimate for the replacement text to
contain an unmatched quote (see <a href="#Traditional-lexical-analysis">Traditional lexical analysis</a>). An
unclosed string or character constant continues into the text
following the macro call. Similarly, the text at the end of a macro's
expansion can run together with the text after the macro invocation to
produce a single token.
<p>Normally comments are removed from the replacement text after the
macro is expanded, but if the <samp><span class="option">-CC</span></samp> option is passed on the
command line comments are preserved. (In fact, the current
implementation removes comments even before saving the macro
replacement text, but it careful to do it in such a way that the
observed effect is identical even in the function-like macro case.)
<p>The ISO stringification operator ‘<samp><span class="samp">#</span></samp>’ and token paste operator
‘<samp><span class="samp">##</span></samp>’ have no special meaning. As explained later, an effect
similar to these operators can be obtained in a different way. Macro
names that are embedded in quotes, either from the main file or after
macro replacement, do not expand.
<p>CPP replaces an unquoted object-like macro name with its replacement
text, and then rescans it for further macros to replace. Unlike
standard macro expansion, traditional macro expansion has no provision
to prevent recursion. If an object-like macro appears unquoted in its
replacement text, it will be replaced again during the rescan pass,
and so on <em>ad infinitum</em>. GCC detects when it is expanding
recursive macros, emits an error message, and continues after the
offending macro invocation.
<pre class="smallexample"> #define PLUS +
#define INC(x) PLUS+x
INC(foo);
==> ++foo;
</pre>
<p>Function-like macros are similar in form but quite different in
behavior to their ISO counterparts. Their arguments are contained
within parentheses, are comma-separated, and can cross physical lines.
Commas within nested parentheses are not treated as argument
separators. Similarly, a quote in an argument cannot be left
unclosed; a following comma or parenthesis that comes before the
closing quote is treated like any other character. There is no
facility for handling variadic macros.
<p>This implementation removes all comments from macro arguments, unless
the <samp><span class="option">-C</span></samp> option is given. The form of all other horizontal
whitespace in arguments is preserved, including leading and trailing
whitespace. In particular
<pre class="smallexample"> f( )
</pre>
<p class="noindent">is treated as an invocation of the macro ‘<samp><span class="samp">f</span></samp>’ with a single
argument consisting of a single space. If you want to invoke a
function-like macro that takes no arguments, you must not leave any
whitespace between the parentheses.
<p>If a macro argument crosses a new line, the new line is replaced with
a space when forming the argument. If the previous line contained an
unterminated quote, the following line inherits the quoted state.
<p>Traditional preprocessors replace parameters in the replacement text
with their arguments regardless of whether the parameters are within
quotes or not. This provides a way to stringize arguments. For
example
<pre class="smallexample"> #define str(x) "x"
str(/* <span class="roman">A comment</span> */some text )
==> "some text "
</pre>
<p class="noindent">Note that the comment is removed, but that the trailing space is
preserved. Here is an example of using a comment to effect token
pasting.
<pre class="smallexample"> #define suffix(x) foo_/**/x
suffix(bar)
==> foo_bar
</pre>
<div class="node">
<a name="Traditional-miscellany"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Traditional-warnings">Traditional warnings</a>,
Previous: <a rel="previous" accesskey="p" href="#Traditional-macros">Traditional macros</a>,
Up: <a rel="up" accesskey="u" href="#Traditional-Mode">Traditional Mode</a>
</div>
<h3 class="section">10.3 Traditional miscellany</h3>
<p>Here are some things to be aware of when using the traditional
preprocessor.
<ul>
<li>Preprocessing directives are recognized only when their leading
‘<samp><span class="samp">#</span></samp>’ appears in the first column. There can be no whitespace
between the beginning of the line and the ‘<samp><span class="samp">#</span></samp>’, but whitespace can
follow the ‘<samp><span class="samp">#</span></samp>’.
<li>A true traditional C preprocessor does not recognize ‘<samp><span class="samp">#error</span></samp>’ or
‘<samp><span class="samp">#pragma</span></samp>’, and may not recognize ‘<samp><span class="samp">#elif</span></samp>’. CPP supports all
the directives in traditional mode that it supports in ISO mode,
including extensions, with the exception that the effects of
‘<samp><span class="samp">#pragma GCC poison</span></samp>’ are undefined.
<li>__STDC__ is not defined.
<li>If you use digraphs the behavior is undefined.
<li>If a line that looks like a directive appears within macro arguments,
the behavior is undefined.
</ul>
<div class="node">
<a name="Traditional-warnings"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#Traditional-miscellany">Traditional miscellany</a>,
Up: <a rel="up" accesskey="u" href="#Traditional-Mode">Traditional Mode</a>
</div>
<h3 class="section">10.4 Traditional warnings</h3>
<p>You can request warnings about features that did not exist, or worked
differently, in traditional C with the <samp><span class="option">-Wtraditional</span></samp> option.
GCC does not warn about features of ISO C which you must use when you
are using a conforming compiler, such as the ‘<samp><span class="samp">#</span></samp>’ and ‘<samp><span class="samp">##</span></samp>’
operators.
<p>Presently <samp><span class="option">-Wtraditional</span></samp> warns about:
<ul>
<li>Macro parameters that appear within string literals in the macro body.
In traditional C macro replacement takes place within string literals,
but does not in ISO C.
<li>In traditional C, some preprocessor directives did not exist.
Traditional preprocessors would only consider a line to be a directive
if the ‘<samp><span class="samp">#</span></samp>’ appeared in column 1 on the line. Therefore
<samp><span class="option">-Wtraditional</span></samp> warns about directives that traditional C
understands but would ignore because the ‘<samp><span class="samp">#</span></samp>’ does not appear as the
first character on the line. It also suggests you hide directives like
‘<samp><span class="samp">#pragma</span></samp>’ not understood by traditional C by indenting them. Some
traditional implementations would not recognize ‘<samp><span class="samp">#elif</span></samp>’, so it
suggests avoiding it altogether.
<li>A function-like macro that appears without an argument list. In some
traditional preprocessors this was an error. In ISO C it merely means
that the macro is not expanded.
<li>The unary plus operator. This did not exist in traditional C.
<li>The ‘<samp><span class="samp">U</span></samp>’ and ‘<samp><span class="samp">LL</span></samp>’ integer constant suffixes, which were not
available in traditional C. (Traditional C does support the ‘<samp><span class="samp">L</span></samp>’
suffix for simple long integer constants.) You are not warned about
uses of these suffixes in macros defined in system headers. For
instance, <code>UINT_MAX</code> may well be defined as <code>4294967295U</code>, but
you will not be warned if you use <code>UINT_MAX</code>.
<p>You can usually avoid the warning, and the related warning about
constants which are so large that they are unsigned, by writing the
integer constant in question in hexadecimal, with no U suffix. Take
care, though, because this gives the wrong result in exotic cases.
</ul>
<div class="node">
<a name="Implementation-Details"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Invocation">Invocation</a>,
Previous: <a rel="previous" accesskey="p" href="#Traditional-Mode">Traditional Mode</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">11 Implementation Details</h2>
<p>Here we document details of how the preprocessor's implementation
affects its user-visible behavior. You should try to avoid undue
reliance on behavior described here, as it is possible that it will
change subtly in future implementations.
<p>Also documented here are obsolete features and changes from previous
versions of CPP.
<ul class="menu">
<li><a accesskey="1" href="#Implementation_002ddefined-behavior">Implementation-defined behavior</a>
<li><a accesskey="2" href="#Implementation-limits">Implementation limits</a>
<li><a accesskey="3" href="#Obsolete-Features">Obsolete Features</a>
<li><a accesskey="4" href="#Differences-from-previous-versions">Differences from previous versions</a>
</ul>
<div class="node">
<a name="Implementation-defined-behavior"></a>
<a name="Implementation_002ddefined-behavior"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Implementation-limits">Implementation limits</a>,
Up: <a rel="up" accesskey="u" href="#Implementation-Details">Implementation Details</a>
</div>
<h3 class="section">11.1 Implementation-defined behavior</h3>
<p><a name="index-implementation_002ddefined-behavior-109"></a>
This is how CPP behaves in all the cases which the C standard
describes as <dfn>implementation-defined</dfn>. This term means that the
implementation is free to do what it likes, but must document its choice
and stick to it.
<!-- FIXME: Check the C++ standard for more implementation-defined stuff. -->
<ul>
<li>The mapping of physical source file multi-byte characters to the
execution character set.
<p>The input character set can be specified using the
<samp><span class="option">-finput-charset</span></samp> option, while the execution character set may
be controlled using the <samp><span class="option">-fexec-charset</span></samp> and
<samp><span class="option">-fwide-exec-charset</span></samp> options.
<li>Identifier characters.
<a name="Identifier-characters"></a>The C and C++ standards allow identifiers to be composed of ‘<samp><span class="samp">_</span></samp>’
and the alphanumeric characters. C++ and C99 also allow universal
character names, and C99 further permits implementation-defined
characters. GCC currently only permits universal character names if
<samp><span class="option">-fextended-identifiers</span></samp> is used, because the implementation of
universal character names in identifiers is experimental.
<p>GCC allows the ‘<samp><span class="samp">$</span></samp>’ character in identifiers as an extension for
most targets. This is true regardless of the <samp><span class="option">std=</span></samp> switch,
since this extension cannot conflict with standards-conforming
programs. When preprocessing assembler, however, dollars are not
identifier characters by default.
<p>Currently the targets that by default do not permit ‘<samp><span class="samp">$</span></samp>’ are AVR,
IP2K, MMIX, MIPS Irix 3, ARM aout, and PowerPC targets for the AIX
operating system.
<p>You can override the default with <samp><span class="option">-fdollars-in-identifiers</span></samp> or
<samp><span class="option">fno-dollars-in-identifiers</span></samp>. See <a href="#fdollars_002din_002didentifiers">fdollars-in-identifiers</a>.
<li>Non-empty sequences of whitespace characters.
<p>In textual output, each whitespace sequence is collapsed to a single
space. For aesthetic reasons, the first token on each non-directive
line of output is preceded with sufficient spaces that it appears in the
same column as it did in the original source file.
<li>The numeric value of character constants in preprocessor expressions.
<p>The preprocessor and compiler interpret character constants in the
same way; i.e. escape sequences such as ‘<samp><span class="samp">\a</span></samp>’ are given the
values they would have on the target machine.
<p>The compiler evaluates a multi-character character constant a character
at a time, shifting the previous value left by the number of bits per
target character, and then or-ing in the bit-pattern of the new
character truncated to the width of a target character. The final
bit-pattern is given type <code>int</code>, and is therefore signed,
regardless of whether single characters are signed or not (a slight
change from versions 3.1 and earlier of GCC). If there are more
characters in the constant than would fit in the target <code>int</code> the
compiler issues a warning, and the excess leading characters are
ignored.
<p>For example, <code>'ab'</code> for a target with an 8-bit <code>char</code> would be
interpreted as ‘<samp><span class="samp">(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')</span></samp>’<!-- /@w -->, and <code>'\234a'</code> as ‘<samp><span class="samp">(int) ((unsigned char) '\234' * 256 + (unsigned char) 'a')</span></samp>’<!-- /@w -->.
<li>Source file inclusion.
<p>For a discussion on how the preprocessor locates header files,
<a href="#Include-Operation">Include Operation</a>.
<li>Interpretation of the filename resulting from a macro-expanded
‘<samp><span class="samp">#include</span></samp>’ directive.
<p>See <a href="#Computed-Includes">Computed Includes</a>.
<li>Treatment of a ‘<samp><span class="samp">#pragma</span></samp>’ directive that after macro-expansion
results in a standard pragma.
<p>No macro expansion occurs on any ‘<samp><span class="samp">#pragma</span></samp>’ directive line, so the
question does not arise.
<p>Note that GCC does not yet implement any of the standard
pragmas.
</ul>
<div class="node">
<a name="Implementation-limits"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Obsolete-Features">Obsolete Features</a>,
Previous: <a rel="previous" accesskey="p" href="#Implementation_002ddefined-behavior">Implementation-defined behavior</a>,
Up: <a rel="up" accesskey="u" href="#Implementation-Details">Implementation Details</a>
</div>
<h3 class="section">11.2 Implementation limits</h3>
<p><a name="index-implementation-limits-110"></a>
CPP has a small number of internal limits. This section lists the
limits which the C standard requires to be no lower than some minimum,
and all the others known. It is intended that there should be as few limits
as possible. If you encounter an undocumented or inconvenient limit,
please report that as a bug. See <a href="gcc.html#Bugs">Reporting Bugs</a>.
<p>Where we say something is limited <dfn>only by available memory</dfn>, that
means that internal data structures impose no intrinsic limit, and space
is allocated with <code>malloc</code> or equivalent. The actual limit will
therefore depend on many things, such as the size of other things
allocated by the compiler at the same time, the amount of memory
consumed by other processes on the same computer, etc.
<ul>
<li>Nesting levels of ‘<samp><span class="samp">#include</span></samp>’ files.
<p>We impose an arbitrary limit of 200 levels, to avoid runaway recursion.
The standard requires at least 15 levels.
<li>Nesting levels of conditional inclusion.
<p>The C standard mandates this be at least 63. CPP is limited only by
available memory.
<li>Levels of parenthesized expressions within a full expression.
<p>The C standard requires this to be at least 63. In preprocessor
conditional expressions, it is limited only by available memory.
<li>Significant initial characters in an identifier or macro name.
<p>The preprocessor treats all characters as significant. The C standard
requires only that the first 63 be significant.
<li>Number of macros simultaneously defined in a single translation unit.
<p>The standard requires at least 4095 be possible. CPP is limited only
by available memory.
<li>Number of parameters in a macro definition and arguments in a macro call.
<p>We allow <code>USHRT_MAX</code>, which is no smaller than 65,535. The minimum
required by the standard is 127.
<li>Number of characters on a logical source line.
<p>The C standard requires a minimum of 4096 be permitted. CPP places
no limits on this, but you may get incorrect column numbers reported in
diagnostics for lines longer than 65,535 characters.
<li>Maximum size of a source file.
<p>The standard does not specify any lower limit on the maximum size of a
source file. GNU cpp maps files into memory, so it is limited by the
available address space. This is generally at least two gigabytes.
Depending on the operating system, the size of physical memory may or
may not be a limitation.
</ul>
<div class="node">
<a name="Obsolete-Features"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Differences-from-previous-versions">Differences from previous versions</a>,
Previous: <a rel="previous" accesskey="p" href="#Implementation-limits">Implementation limits</a>,
Up: <a rel="up" accesskey="u" href="#Implementation-Details">Implementation Details</a>
</div>
<h3 class="section">11.3 Obsolete Features</h3>
<p>CPP has some features which are present mainly for compatibility with
older programs. We discourage their use in new code. In some cases,
we plan to remove the feature in a future version of GCC.
<h4 class="subsection">11.3.1 Assertions</h4>
<p><a name="index-assertions-111"></a>
<dfn>Assertions</dfn> are a deprecated alternative to macros in writing
conditionals to test what sort of computer or system the compiled
program will run on. Assertions are usually predefined, but you can
define them with preprocessing directives or command-line options.
<p>Assertions were intended to provide a more systematic way to describe
the compiler's target system and we added them for compatibility with
existing compilers. In practice they are just as unpredictable as the
system-specific predefined macros. In addition, they are not part of
any standard, and only a few compilers support them.
Therefore, the use of assertions is <strong>less</strong> portable than the use
of system-specific predefined macros. We recommend you do not use them at
all.
<p><a name="index-predicates-112"></a>An assertion looks like this:
<pre class="smallexample"> #<var>predicate</var> (<var>answer</var>)
</pre>
<p class="noindent"><var>predicate</var> must be a single identifier. <var>answer</var> can be any
sequence of tokens; all characters are significant except for leading
and trailing whitespace, and differences in internal whitespace
sequences are ignored. (This is similar to the rules governing macro
redefinition.) Thus, <code>(x + y)</code> is different from <code>(x+y)</code> but
equivalent to <code>( x + y )<!-- /@w --></code>. Parentheses do not nest inside an
answer.
<p><a name="index-testing-predicates-113"></a>To test an assertion, you write it in an ‘<samp><span class="samp">#if</span></samp>’. For example, this
conditional succeeds if either <code>vax</code> or <code>ns16000</code> has been
asserted as an answer for <code>machine</code>.
<pre class="smallexample"> #if #machine (vax) || #machine (ns16000)
</pre>
<p class="noindent">You can test whether <em>any</em> answer is asserted for a predicate by
omitting the answer in the conditional:
<pre class="smallexample"> #if #machine
</pre>
<p><a name="index-g_t_0023assert-114"></a>Assertions are made with the ‘<samp><span class="samp">#assert</span></samp>’ directive. Its sole
argument is the assertion to make, without the leading ‘<samp><span class="samp">#</span></samp>’ that
identifies assertions in conditionals.
<pre class="smallexample"> #assert <var>predicate</var> (<var>answer</var>)
</pre>
<p class="noindent">You may make several assertions with the same predicate and different
answers. Subsequent assertions do not override previous ones for the
same predicate. All the answers for any given predicate are
simultaneously true.
<p><a name="index-assertions_002c-canceling-115"></a><a name="index-g_t_0023unassert-116"></a>Assertions can be canceled with the ‘<samp><span class="samp">#unassert</span></samp>’ directive. It
has the same syntax as ‘<samp><span class="samp">#assert</span></samp>’. In that form it cancels only the
answer which was specified on the ‘<samp><span class="samp">#unassert</span></samp>’ line; other answers
for that predicate remain true. You can cancel an entire predicate by
leaving out the answer:
<pre class="smallexample"> #unassert <var>predicate</var>
</pre>
<p class="noindent">In either form, if no such assertion has been made, ‘<samp><span class="samp">#unassert</span></samp>’ has
no effect.
<p>You can also make or cancel assertions using command line options.
See <a href="#Invocation">Invocation</a>.
<div class="node">
<a name="Differences-from-previous-versions"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#Obsolete-Features">Obsolete Features</a>,
Up: <a rel="up" accesskey="u" href="#Implementation-Details">Implementation Details</a>
</div>
<h3 class="section">11.4 Differences from previous versions</h3>
<p><a name="index-differences-from-previous-versions-117"></a>
This section details behavior which has changed from previous versions
of CPP. We do not plan to change it again in the near future, but
we do not promise not to, either.
<p>The “previous versions” discussed here are 2.95 and before. The
behavior of GCC 3.0 is mostly the same as the behavior of the widely
used 2.96 and 2.97 development snapshots. Where there are differences,
they generally represent bugs in the snapshots.
<ul>
<li>-I- deprecated
<p>This option has been deprecated in 4.0. <samp><span class="option">-iquote</span></samp> is meant to
replace the need for this option.
<li>Order of evaluation of ‘<samp><span class="samp">#</span></samp>’ and ‘<samp><span class="samp">##</span></samp>’ operators
<p>The standard does not specify the order of evaluation of a chain of
‘<samp><span class="samp">##</span></samp>’ operators, nor whether ‘<samp><span class="samp">#</span></samp>’ is evaluated before, after, or
at the same time as ‘<samp><span class="samp">##</span></samp>’. You should therefore not write any code
which depends on any specific ordering. It is possible to guarantee an
ordering, if you need one, by suitable use of nested macros.
<p>An example of where this might matter is pasting the arguments ‘<samp><span class="samp">1</span></samp>’,
‘<samp><span class="samp">e</span></samp>’ and ‘<samp><span class="samp">-2</span></samp>’. This would be fine for left-to-right pasting,
but right-to-left pasting would produce an invalid token ‘<samp><span class="samp">e-2</span></samp>’.
<p>GCC 3.0 evaluates ‘<samp><span class="samp">#</span></samp>’ and ‘<samp><span class="samp">##</span></samp>’ at the same time and strictly
left to right. Older versions evaluated all ‘<samp><span class="samp">#</span></samp>’ operators first,
then all ‘<samp><span class="samp">##</span></samp>’ operators, in an unreliable order.
<li>The form of whitespace between tokens in preprocessor output
<p>See <a href="#Preprocessor-Output">Preprocessor Output</a>, for the current textual format. This is
also the format used by stringification. Normally, the preprocessor
communicates tokens directly to the compiler's parser, and whitespace
does not come up at all.
<p>Older versions of GCC preserved all whitespace provided by the user and
inserted lots more whitespace of their own, because they could not
accurately predict when extra spaces were needed to prevent accidental
token pasting.
<li>Optional argument when invoking rest argument macros
<p>As an extension, GCC permits you to omit the variable arguments entirely
when you use a variable argument macro. This is forbidden by the 1999 C
standard, and will provoke a pedantic warning with GCC 3.0. Previous
versions accepted it silently.
<li>‘<samp><span class="samp">##</span></samp>’ swallowing preceding text in rest argument macros
<p>Formerly, in a macro expansion, if ‘<samp><span class="samp">##</span></samp>’ appeared before a variable
arguments parameter, and the set of tokens specified for that argument
in the macro invocation was empty, previous versions of CPP would
back up and remove the preceding sequence of non-whitespace characters
(<strong>not</strong> the preceding token). This extension is in direct
conflict with the 1999 C standard and has been drastically pared back.
<p>In the current version of the preprocessor, if ‘<samp><span class="samp">##</span></samp>’ appears between
a comma and a variable arguments parameter, and the variable argument is
omitted entirely, the comma will be removed from the expansion. If the
variable argument is empty, or the token before ‘<samp><span class="samp">##</span></samp>’ is not a
comma, then ‘<samp><span class="samp">##</span></samp>’ behaves as a normal token paste.
<li>‘<samp><span class="samp">#line</span></samp>’ and ‘<samp><span class="samp">#include</span></samp>’
<p>The ‘<samp><span class="samp">#line</span></samp>’ directive used to change GCC's notion of the
“directory containing the current file”, used by ‘<samp><span class="samp">#include</span></samp>’ with
a double-quoted header file name. In 3.0 and later, it does not.
See <a href="#Line-Control">Line Control</a>, for further explanation.
<li>Syntax of ‘<samp><span class="samp">#line</span></samp>’
<p>In GCC 2.95 and previous, the string constant argument to ‘<samp><span class="samp">#line</span></samp>’
was treated the same way as the argument to ‘<samp><span class="samp">#include</span></samp>’: backslash
escapes were not honored, and the string ended at the second ‘<samp><span class="samp">"</span></samp>’.
This is not compliant with the C standard. In GCC 3.0, an attempt was
made to correct the behavior, so that the string was treated as a real
string constant, but it turned out to be buggy. In 3.1, the bugs have
been fixed. (We are not fixing the bugs in 3.0 because they affect
relatively few people and the fix is quite invasive.)
</ul>
<div class="node">
<a name="Invocation"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Environment-Variables">Environment Variables</a>,
Previous: <a rel="previous" accesskey="p" href="#Implementation-Details">Implementation Details</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">12 Invocation</h2>
<p><a name="index-invocation-118"></a><a name="index-command-line-119"></a>
Most often when you use the C preprocessor you will not have to invoke it
explicitly: the C compiler will do so automatically. However, the
preprocessor is sometimes useful on its own. All the options listed
here are also acceptable to the C compiler and have the same meaning,
except that the C compiler has different rules for specifying the output
file.
<p><em>Note:</em> Whether you use the preprocessor by way of <samp><span class="command">gcc</span></samp>
or <samp><span class="command">cpp</span></samp>, the <dfn>compiler driver</dfn> is run first. This
program's purpose is to translate your command into invocations of the
programs that do the actual work. Their command line interfaces are
similar but not identical to the documented interface, and may change
without notice.
<!-- man begin OPTIONS -->
<p>The C preprocessor expects two file names as arguments, <var>infile</var> and
<var>outfile</var>. The preprocessor reads <var>infile</var> together with any
other files it specifies with ‘<samp><span class="samp">#include</span></samp>’. All the output generated
by the combined input files is written in <var>outfile</var>.
<p>Either <var>infile</var> or <var>outfile</var> may be <samp><span class="option">-</span></samp>, which as
<var>infile</var> means to read from standard input and as <var>outfile</var>
means to write to standard output. Also, if either file is omitted, it
means the same as if <samp><span class="option">-</span></samp> had been specified for that file.
<p>Unless otherwise noted, or the option ends in ‘<samp><span class="samp">=</span></samp>’, all options
which take an argument may have that argument appear either immediately
after the option, or with a space between option and argument:
<samp><span class="option">-Ifoo</span></samp> and <samp><span class="option">-I foo</span></samp> have the same effect.
<p><a name="index-grouping-options-120"></a><a name="index-options_002c-grouping-121"></a>Many options have multi-letter names; therefore multiple single-letter
options may <em>not</em> be grouped: <samp><span class="option">-dM</span></samp> is very different from
‘<samp><span class="samp">-d -M</span></samp>’<!-- /@w -->.
<p><a name="index-options-122"></a>
<!-- Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, -->
<!-- 2010, Free Software Foundation, Inc. -->
<!-- This is part of the CPP and GCC manuals. -->
<!-- For copying conditions, see the file gcc.texi. -->
<!-- -->
<!-- Options affecting the preprocessor -->
<!-- -->
<!-- If this file is included with the flag ``cppmanual'' set, it is -->
<!-- formatted for inclusion in the CPP manual; otherwise the main GCC manual. -->
<dl>
<dt><code>-D </code><var>name</var><dd><a name="index-D-123"></a>Predefine <var>name</var> as a macro, with definition <code>1</code>.
<br><dt><code>-D </code><var>name</var><code>=</code><var>definition</var><dd>The contents of <var>definition</var> are tokenized and processed as if
they appeared during translation phase three in a ‘<samp><span class="samp">#define</span></samp>’
directive. In particular, the definition will be truncated by
embedded newline characters.
<p>If you are invoking the preprocessor from a shell or shell-like
program you may need to use the shell's quoting syntax to protect
characters such as spaces that have a meaning in the shell syntax.
<p>If you wish to define a function-like macro on the command line, write
its argument list with surrounding parentheses before the equals sign
(if any). Parentheses are meaningful to most shells, so you will need
to quote the option. With <samp><span class="command">sh</span></samp> and <samp><span class="command">csh</span></samp>,
<samp><span class="option">-D'</span><var>name</var><span class="option">(</span><var>args<small class="dots">...</small></var><span class="option">)=</span><var>definition</var><span class="option">'</span></samp> works.
<p><samp><span class="option">-D</span></samp> and <samp><span class="option">-U</span></samp> options are processed in the order they
are given on the command line. All <samp><span class="option">-imacros </span><var>file</var></samp> and
<samp><span class="option">-include </span><var>file</var></samp> options are processed after all
<samp><span class="option">-D</span></samp> and <samp><span class="option">-U</span></samp> options.
<br><dt><code>-U </code><var>name</var><dd><a name="index-U-124"></a>Cancel any previous definition of <var>name</var>, either built in or
provided with a <samp><span class="option">-D</span></samp> option.
<br><dt><code>-undef</code><dd><a name="index-undef-125"></a>Do not predefine any system-specific or GCC-specific macros. The
standard predefined macros remain defined.
See <a href="#Standard-Predefined-Macros">Standard Predefined Macros</a>.
<br><dt><code>-I </code><var>dir</var><dd><a name="index-I-126"></a>Add the directory <var>dir</var> to the list of directories to be searched
for header files.
See <a href="#Search-Path">Search Path</a>.
Directories named by <samp><span class="option">-I</span></samp> are searched before the standard
system include directories. If the directory <var>dir</var> is a standard
system include directory, the option is ignored to ensure that the
default search order for system directories and the special treatment
of system headers are not defeated
(see <a href="#System-Headers">System Headers</a>)
.
If <var>dir</var> begins with <code>=</code>, then the <code>=</code> will be replaced
by the sysroot prefix; see <samp><span class="option">--sysroot</span></samp> and <samp><span class="option">-isysroot</span></samp>.
<br><dt><code>-o </code><var>file</var><dd><a name="index-o-127"></a>Write output to <var>file</var>. This is the same as specifying <var>file</var>
as the second non-option argument to <samp><span class="command">cpp</span></samp>. <samp><span class="command">gcc</span></samp> has a
different interpretation of a second non-option argument, so you must
use <samp><span class="option">-o</span></samp> to specify the output file.
<br><dt><code>-Wall</code><dd><a name="index-Wall-128"></a>Turns on all optional warnings which are desirable for normal code.
At present this is <samp><span class="option">-Wcomment</span></samp>, <samp><span class="option">-Wtrigraphs</span></samp>,
<samp><span class="option">-Wmultichar</span></samp> and a warning about integer promotion causing a
change of sign in <code>#if</code> expressions. Note that many of the
preprocessor's warnings are on by default and have no options to
control them.
<br><dt><code>-Wcomment</code><dt><code>-Wcomments</code><dd><a name="index-Wcomment-129"></a><a name="index-Wcomments-130"></a>Warn whenever a comment-start sequence ‘<samp><span class="samp">/*</span></samp>’ appears in a ‘<samp><span class="samp">/*</span></samp>’
comment, or whenever a backslash-newline appears in a ‘<samp><span class="samp">//</span></samp>’ comment.
(Both forms have the same effect.)
<br><dt><code>-Wtrigraphs</code><dd><a name="index-Wtrigraphs-131"></a><a name="Wtrigraphs"></a>Most trigraphs in comments cannot affect the meaning of the program.
However, a trigraph that would form an escaped newline (‘<samp><span class="samp">??/</span></samp>’ at
the end of a line) can, by changing where the comment begins or ends.
Therefore, only trigraphs that would form escaped newlines produce
warnings inside a comment.
<p>This option is implied by <samp><span class="option">-Wall</span></samp>. If <samp><span class="option">-Wall</span></samp> is not
given, this option is still enabled unless trigraphs are enabled. To
get trigraph conversion without warnings, but get the other
<samp><span class="option">-Wall</span></samp> warnings, use ‘<samp><span class="samp">-trigraphs -Wall -Wno-trigraphs</span></samp>’.
<br><dt><code>-Wtraditional</code><dd><a name="index-Wtraditional-132"></a>Warn about certain constructs that behave differently in traditional and
ISO C. Also warn about ISO C constructs that have no traditional C
equivalent, and problematic constructs which should be avoided.
See <a href="#Traditional-Mode">Traditional Mode</a>.
<br><dt><code>-Wundef</code><dd><a name="index-Wundef-133"></a>Warn whenever an identifier which is not a macro is encountered in an
‘<samp><span class="samp">#if</span></samp>’ directive, outside of ‘<samp><span class="samp">defined</span></samp>’. Such identifiers are
replaced with zero.
<br><dt><code>-Wunused-macros</code><dd><a name="index-Wunused_002dmacros-134"></a>Warn about macros defined in the main file that are unused. A macro
is <dfn>used</dfn> if it is expanded or tested for existence at least once.
The preprocessor will also warn if the macro has not been used at the
time it is redefined or undefined.
<p>Built-in macros, macros defined on the command line, and macros
defined in include files are not warned about.
<p><em>Note:</em> If a macro is actually used, but only used in skipped
conditional blocks, then CPP will report it as unused. To avoid the
warning in such a case, you might improve the scope of the macro's
definition by, for example, moving it into the first skipped block.
Alternatively, you could provide a dummy use with something like:
<pre class="smallexample"> #if defined the_macro_causing_the_warning
#endif
</pre>
<br><dt><code>-Wendif-labels</code><dd><a name="index-Wendif_002dlabels-135"></a>Warn whenever an ‘<samp><span class="samp">#else</span></samp>’ or an ‘<samp><span class="samp">#endif</span></samp>’ are followed by text.
This usually happens in code of the form
<pre class="smallexample"> #if FOO
...
#else FOO
...
#endif FOO
</pre>
<p class="noindent">The second and third <code>FOO</code> should be in comments, but often are not
in older programs. This warning is on by default.
<br><dt><code>-Werror</code><dd><a name="index-Werror-136"></a>Make all warnings into hard errors. Source code which triggers warnings
will be rejected.
<br><dt><code>-Wsystem-headers</code><dd><a name="index-Wsystem_002dheaders-137"></a>Issue warnings for code in system headers. These are normally unhelpful
in finding bugs in your own code, therefore suppressed. If you are
responsible for the system library, you may want to see them.
<br><dt><code>-w</code><dd><a name="index-w-138"></a>Suppress all warnings, including those which GNU CPP issues by default.
<br><dt><code>-pedantic</code><dd><a name="index-pedantic-139"></a>Issue all the mandatory diagnostics listed in the C standard. Some of
them are left out by default, since they trigger frequently on harmless
code.
<br><dt><code>-pedantic-errors</code><dd><a name="index-pedantic_002derrors-140"></a>Issue all the mandatory diagnostics, and make all mandatory diagnostics
into errors. This includes mandatory diagnostics that GCC issues
without ‘<samp><span class="samp">-pedantic</span></samp>’ but treats as warnings.
<br><dt><code>-M</code><dd><a name="index-M-141"></a><a name="index-g_t_0040command_007bmake_007d-142"></a><a name="index-dependencies_002c-_0040command_007bmake_007d-143"></a>Instead of outputting the result of preprocessing, output a rule
suitable for <samp><span class="command">make</span></samp> describing the dependencies of the main
source file. The preprocessor outputs one <samp><span class="command">make</span></samp> rule containing
the object file name for that source file, a colon, and the names of all
the included files, including those coming from <samp><span class="option">-include</span></samp> or
<samp><span class="option">-imacros</span></samp> command line options.
<p>Unless specified explicitly (with <samp><span class="option">-MT</span></samp> or <samp><span class="option">-MQ</span></samp>), the
object file name consists of the name of the source file with any
suffix replaced with object file suffix and with any leading directory
parts removed. If there are many included files then the rule is
split into several lines using ‘<samp><span class="samp">\</span></samp>’-newline. The rule has no
commands.
<p>This option does not suppress the preprocessor's debug output, such as
<samp><span class="option">-dM</span></samp>. To avoid mixing such debug output with the dependency
rules you should explicitly specify the dependency output file with
<samp><span class="option">-MF</span></samp>, or use an environment variable like
<samp><span class="env">DEPENDENCIES_OUTPUT</span></samp> (see <a href="#Environment-Variables">Environment Variables</a>). Debug output
will still be sent to the regular output stream as normal.
<p>Passing <samp><span class="option">-M</span></samp> to the driver implies <samp><span class="option">-E</span></samp>, and suppresses
warnings with an implicit <samp><span class="option">-w</span></samp>.
<br><dt><code>-MM</code><dd><a name="index-MM-144"></a>Like <samp><span class="option">-M</span></samp> but do not mention header files that are found in
system header directories, nor header files that are included,
directly or indirectly, from such a header.
<p>This implies that the choice of angle brackets or double quotes in an
‘<samp><span class="samp">#include</span></samp>’ directive does not in itself determine whether that
header will appear in <samp><span class="option">-MM</span></samp> dependency output. This is a
slight change in semantics from GCC versions 3.0 and earlier.
<p><a name="dashMF"></a><br><dt><code>-MF </code><var>file</var><dd><a name="index-MF-145"></a>When used with <samp><span class="option">-M</span></samp> or <samp><span class="option">-MM</span></samp>, specifies a
file to write the dependencies to. If no <samp><span class="option">-MF</span></samp> switch is given
the preprocessor sends the rules to the same place it would have sent
preprocessed output.
<p>When used with the driver options <samp><span class="option">-MD</span></samp> or <samp><span class="option">-MMD</span></samp>,
<samp><span class="option">-MF</span></samp> overrides the default dependency output file.
<br><dt><code>-MG</code><dd><a name="index-MG-146"></a>In conjunction with an option such as <samp><span class="option">-M</span></samp> requesting
dependency generation, <samp><span class="option">-MG</span></samp> assumes missing header files are
generated files and adds them to the dependency list without raising
an error. The dependency filename is taken directly from the
<code>#include</code> directive without prepending any path. <samp><span class="option">-MG</span></samp>
also suppresses preprocessed output, as a missing header file renders
this useless.
<p>This feature is used in automatic updating of makefiles.
<br><dt><code>-MP</code><dd><a name="index-MP-147"></a>This option instructs CPP to add a phony target for each dependency
other than the main file, causing each to depend on nothing. These
dummy rules work around errors <samp><span class="command">make</span></samp> gives if you remove header
files without updating the <samp><span class="file">Makefile</span></samp> to match.
<p>This is typical output:
<pre class="smallexample"> test.o: test.c test.h
test.h:
</pre>
<br><dt><code>-MT </code><var>target</var><dd><a name="index-MT-148"></a>
Change the target of the rule emitted by dependency generation. By
default CPP takes the name of the main input file, deletes any
directory components and any file suffix such as ‘<samp><span class="samp">.c</span></samp>’, and
appends the platform's usual object suffix. The result is the target.
<p>An <samp><span class="option">-MT</span></samp> option will set the target to be exactly the string you
specify. If you want multiple targets, you can specify them as a single
argument to <samp><span class="option">-MT</span></samp>, or use multiple <samp><span class="option">-MT</span></samp> options.
<p>For example, <samp><span class="option">-MT '$(objpfx)foo.o'<!-- /@w --></span></samp> might give
<pre class="smallexample"> $(objpfx)foo.o: foo.c
</pre>
<br><dt><code>-MQ </code><var>target</var><dd><a name="index-MQ-149"></a>
Same as <samp><span class="option">-MT</span></samp>, but it quotes any characters which are special to
Make. <samp><span class="option">-MQ '$(objpfx)foo.o'<!-- /@w --></span></samp> gives
<pre class="smallexample"> $$(objpfx)foo.o: foo.c
</pre>
<p>The default target is automatically quoted, as if it were given with
<samp><span class="option">-MQ</span></samp>.
<br><dt><code>-MD</code><dd><a name="index-MD-150"></a><samp><span class="option">-MD</span></samp> is equivalent to <samp><span class="option">-M -MF </span><var>file</var></samp>, except that
<samp><span class="option">-E</span></samp> is not implied. The driver determines <var>file</var> based on
whether an <samp><span class="option">-o</span></samp> option is given. If it is, the driver uses its
argument but with a suffix of <samp><span class="file">.d</span></samp>, otherwise it takes the name
of the input file, removes any directory components and suffix, and
applies a <samp><span class="file">.d</span></samp> suffix.
<p>If <samp><span class="option">-MD</span></samp> is used in conjunction with <samp><span class="option">-E</span></samp>, any
<samp><span class="option">-o</span></samp> switch is understood to specify the dependency output file
(see <a href="#dashMF">-MF</a>), but if used without <samp><span class="option">-E</span></samp>, each <samp><span class="option">-o</span></samp>
is understood to specify a target object file.
<p>Since <samp><span class="option">-E</span></samp> is not implied, <samp><span class="option">-MD</span></samp> can be used to generate
a dependency output file as a side-effect of the compilation process.
<br><dt><code>-MMD</code><dd><a name="index-MMD-151"></a>Like <samp><span class="option">-MD</span></samp> except mention only user header files, not system
header files.
<br><dt><code>-x c</code><dt><code>-x c++</code><dt><code>-x objective-c</code><dt><code>-x assembler-with-cpp</code><dd><a name="index-x-152"></a>Specify the source language: C, C++, Objective-C, or assembly. This has
nothing to do with standards conformance or extensions; it merely
selects which base syntax to expect. If you give none of these options,
cpp will deduce the language from the extension of the source file:
‘<samp><span class="samp">.c</span></samp>’, ‘<samp><span class="samp">.cc</span></samp>’, ‘<samp><span class="samp">.m</span></samp>’, or ‘<samp><span class="samp">.S</span></samp>’. Some other common
extensions for C++ and assembly are also recognized. If cpp does not
recognize the extension, it will treat the file as C; this is the most
generic mode.
<p><em>Note:</em> Previous versions of cpp accepted a <samp><span class="option">-lang</span></samp> option
which selected both the language and the standards conformance level.
This option has been removed, because it conflicts with the <samp><span class="option">-l</span></samp>
option.
<br><dt><code>-std=</code><var>standard</var><dt><code>-ansi</code><dd><a name="index-ansi-153"></a><a name="index-std_003d-154"></a>Specify the standard to which the code should conform. Currently CPP
knows about C and C++ standards; others may be added in the future.
<p><var>standard</var>
may be one of:
<dl>
<dt><code>c90</code><dt><code>c89</code><dt><code>iso9899:1990</code><dd>The ISO C standard from 1990. ‘<samp><span class="samp">c90</span></samp>’ is the customary shorthand for
this version of the standard.
<p>The <samp><span class="option">-ansi</span></samp> option is equivalent to <samp><span class="option">-std=c90</span></samp>.
<br><dt><code>iso9899:199409</code><dd>The 1990 C standard, as amended in 1994.
<br><dt><code>iso9899:1999</code><dt><code>c99</code><dt><code>iso9899:199x</code><dt><code>c9x</code><dd>The revised ISO C standard, published in December 1999. Before
publication, this was known as C9X.
<br><dt><code>c1x</code><dd>The next version of the ISO C standard, still under development.
<br><dt><code>gnu90</code><dt><code>gnu89</code><dd>The 1990 C standard plus GNU extensions. This is the default.
<br><dt><code>gnu99</code><dt><code>gnu9x</code><dd>The 1999 C standard plus GNU extensions.
<br><dt><code>gnu1x</code><dd>The next version of the ISO C standard, still under development, plus
GNU extensions.
<br><dt><code>c++98</code><dd>The 1998 ISO C++ standard plus amendments.
<br><dt><code>gnu++98</code><dd>The same as <samp><span class="option">-std=c++98</span></samp> plus GNU extensions. This is the
default for C++ code.
</dl>
<br><dt><code>-I-</code><dd><a name="index-I_002d-155"></a>Split the include path. Any directories specified with <samp><span class="option">-I</span></samp>
options before <samp><span class="option">-I-</span></samp> are searched only for headers requested with
<code>#include "</code><var>file</var><code>"<!-- /@w --></code>; they are not searched for
<code>#include <</code><var>file</var><code>><!-- /@w --></code>. If additional directories are
specified with <samp><span class="option">-I</span></samp> options after the <samp><span class="option">-I-</span></samp>, those
directories are searched for all ‘<samp><span class="samp">#include</span></samp>’ directives.
<p>In addition, <samp><span class="option">-I-</span></samp> inhibits the use of the directory of the current
file directory as the first search directory for <code>#include "</code><var>file</var><code>"<!-- /@w --></code>.
See <a href="#Search-Path">Search Path</a>.
This option has been deprecated.
<br><dt><code>-nostdinc</code><dd><a name="index-nostdinc-156"></a>Do not search the standard system directories for header files.
Only the directories you have specified with <samp><span class="option">-I</span></samp> options
(and the directory of the current file, if appropriate) are searched.
<br><dt><code>-nostdinc++</code><dd><a name="index-nostdinc_002b_002b-157"></a>Do not search for header files in the C++-specific standard directories,
but do still search the other standard directories. (This option is
used when building the C++ library.)
<br><dt><code>-include </code><var>file</var><dd><a name="index-include-158"></a>Process <var>file</var> as if <code>#include "file"</code> appeared as the first
line of the primary source file. However, the first directory searched
for <var>file</var> is the preprocessor's working directory <em>instead of</em>
the directory containing the main source file. If not found there, it
is searched for in the remainder of the <code>#include "..."</code> search
chain as normal.
<p>If multiple <samp><span class="option">-include</span></samp> options are given, the files are included
in the order they appear on the command line.
<br><dt><code>-imacros </code><var>file</var><dd><a name="index-imacros-159"></a>Exactly like <samp><span class="option">-include</span></samp>, except that any output produced by
scanning <var>file</var> is thrown away. Macros it defines remain defined.
This allows you to acquire all the macros from a header without also
processing its declarations.
<p>All files specified by <samp><span class="option">-imacros</span></samp> are processed before all files
specified by <samp><span class="option">-include</span></samp>.
<br><dt><code>-idirafter </code><var>dir</var><dd><a name="index-idirafter-160"></a>Search <var>dir</var> for header files, but do it <em>after</em> all
directories specified with <samp><span class="option">-I</span></samp> and the standard system directories
have been exhausted. <var>dir</var> is treated as a system include directory.
If <var>dir</var> begins with <code>=</code>, then the <code>=</code> will be replaced
by the sysroot prefix; see <samp><span class="option">--sysroot</span></samp> and <samp><span class="option">-isysroot</span></samp>.
<br><dt><code>-iprefix </code><var>prefix</var><dd><a name="index-iprefix-161"></a>Specify <var>prefix</var> as the prefix for subsequent <samp><span class="option">-iwithprefix</span></samp>
options. If the prefix represents a directory, you should include the
final ‘<samp><span class="samp">/</span></samp>’.
<br><dt><code>-iwithprefix </code><var>dir</var><dt><code>-iwithprefixbefore </code><var>dir</var><dd><a name="index-iwithprefix-162"></a><a name="index-iwithprefixbefore-163"></a>Append <var>dir</var> to the prefix specified previously with
<samp><span class="option">-iprefix</span></samp>, and add the resulting directory to the include search
path. <samp><span class="option">-iwithprefixbefore</span></samp> puts it in the same place <samp><span class="option">-I</span></samp>
would; <samp><span class="option">-iwithprefix</span></samp> puts it where <samp><span class="option">-idirafter</span></samp> would.
<br><dt><code>-isysroot </code><var>dir</var><dd><a name="index-isysroot-164"></a>This option is like the <samp><span class="option">--sysroot</span></samp> option, but applies only to
header files (except for Darwin targets, where it applies to both header
files and libraries). See the <samp><span class="option">--sysroot</span></samp> option for more
information.
<br><dt><code>-imultilib </code><var>dir</var><dd><a name="index-imultilib-165"></a>Use <var>dir</var> as a subdirectory of the directory containing
target-specific C++ headers.
<br><dt><code>-isystem </code><var>dir</var><dd><a name="index-isystem-166"></a>Search <var>dir</var> for header files, after all directories specified by
<samp><span class="option">-I</span></samp> but before the standard system directories. Mark it
as a system directory, so that it gets the same special treatment as
is applied to the standard system directories.
See <a href="#System-Headers">System Headers</a>.
If <var>dir</var> begins with <code>=</code>, then the <code>=</code> will be replaced
by the sysroot prefix; see <samp><span class="option">--sysroot</span></samp> and <samp><span class="option">-isysroot</span></samp>.
<br><dt><code>-iquote </code><var>dir</var><dd><a name="index-iquote-167"></a>Search <var>dir</var> only for header files requested with
<code>#include "</code><var>file</var><code>"<!-- /@w --></code>; they are not searched for
<code>#include <</code><var>file</var><code>><!-- /@w --></code>, before all directories specified by
<samp><span class="option">-I</span></samp> and before the standard system directories.
See <a href="#Search-Path">Search Path</a>.
If <var>dir</var> begins with <code>=</code>, then the <code>=</code> will be replaced
by the sysroot prefix; see <samp><span class="option">--sysroot</span></samp> and <samp><span class="option">-isysroot</span></samp>.
<br><dt><code>-fdirectives-only</code><dd><a name="index-fdirectives_002donly-168"></a>When preprocessing, handle directives, but do not expand macros.
<p>The option's behavior depends on the <samp><span class="option">-E</span></samp> and <samp><span class="option">-fpreprocessed</span></samp>
options.
<p>With <samp><span class="option">-E</span></samp>, preprocessing is limited to the handling of directives
such as <code>#define</code>, <code>#ifdef</code>, and <code>#error</code>. Other
preprocessor operations, such as macro expansion and trigraph
conversion are not performed. In addition, the <samp><span class="option">-dD</span></samp> option is
implicitly enabled.
<p>With <samp><span class="option">-fpreprocessed</span></samp>, predefinition of command line and most
builtin macros is disabled. Macros such as <code>__LINE__</code>, which are
contextually dependent, are handled normally. This enables compilation of
files previously preprocessed with <code>-E -fdirectives-only</code>.
<p>With both <samp><span class="option">-E</span></samp> and <samp><span class="option">-fpreprocessed</span></samp>, the rules for
<samp><span class="option">-fpreprocessed</span></samp> take precedence. This enables full preprocessing of
files previously preprocessed with <code>-E -fdirectives-only</code>.
<br><dt><code>-fdollars-in-identifiers</code><dd><a name="index-fdollars_002din_002didentifiers-169"></a><a name="fdollars_002din_002didentifiers"></a>Accept ‘<samp><span class="samp">$</span></samp>’ in identifiers.
See <a href="#Identifier-characters">Identifier characters</a>.
<br><dt><code>-fextended-identifiers</code><dd><a name="index-fextended_002didentifiers-170"></a>Accept universal character names in identifiers. This option is
experimental; in a future version of GCC, it will be enabled by
default for C99 and C++.
<br><dt><code>-fpreprocessed</code><dd><a name="index-fpreprocessed-171"></a>Indicate to the preprocessor that the input file has already been
preprocessed. This suppresses things like macro expansion, trigraph
conversion, escaped newline splicing, and processing of most directives.
The preprocessor still recognizes and removes comments, so that you can
pass a file preprocessed with <samp><span class="option">-C</span></samp> to the compiler without
problems. In this mode the integrated preprocessor is little more than
a tokenizer for the front ends.
<p><samp><span class="option">-fpreprocessed</span></samp> is implicit if the input file has one of the
extensions ‘<samp><span class="samp">.i</span></samp>’, ‘<samp><span class="samp">.ii</span></samp>’ or ‘<samp><span class="samp">.mi</span></samp>’. These are the
extensions that GCC uses for preprocessed files created by
<samp><span class="option">-save-temps</span></samp>.
<br><dt><code>-ftabstop=</code><var>width</var><dd><a name="index-ftabstop-172"></a>Set the distance between tab stops. This helps the preprocessor report
correct column numbers in warnings or errors, even if tabs appear on the
line. If the value is less than 1 or greater than 100, the option is
ignored. The default is 8.
<br><dt><code>-fexec-charset=</code><var>charset</var><dd><a name="index-fexec_002dcharset-173"></a><a name="index-character-set_002c-execution-174"></a>Set the execution character set, used for string and character
constants. The default is UTF-8. <var>charset</var> can be any encoding
supported by the system's <code>iconv</code> library routine.
<br><dt><code>-fwide-exec-charset=</code><var>charset</var><dd><a name="index-fwide_002dexec_002dcharset-175"></a><a name="index-character-set_002c-wide-execution-176"></a>Set the wide execution character set, used for wide string and
character constants. The default is UTF-32 or UTF-16, whichever
corresponds to the width of <code>wchar_t</code>. As with
<samp><span class="option">-fexec-charset</span></samp>, <var>charset</var> can be any encoding supported
by the system's <code>iconv</code> library routine; however, you will have
problems with encodings that do not fit exactly in <code>wchar_t</code>.
<br><dt><code>-finput-charset=</code><var>charset</var><dd><a name="index-finput_002dcharset-177"></a><a name="index-character-set_002c-input-178"></a>Set the input character set, used for translation from the character
set of the input file to the source character set used by GCC. If the
locale does not specify, or GCC cannot get this information from the
locale, the default is UTF-8. This can be overridden by either the locale
or this command line option. Currently the command line option takes
precedence if there's a conflict. <var>charset</var> can be any encoding
supported by the system's <code>iconv</code> library routine.
<br><dt><code>-fworking-directory</code><dd><a name="index-fworking_002ddirectory-179"></a><a name="index-fno_002dworking_002ddirectory-180"></a>Enable generation of linemarkers in the preprocessor output that will
let the compiler know the current working directory at the time of
preprocessing. When this option is enabled, the preprocessor will
emit, after the initial linemarker, a second linemarker with the
current working directory followed by two slashes. GCC will use this
directory, when it's present in the preprocessed input, as the
directory emitted as the current working directory in some debugging
information formats. This option is implicitly enabled if debugging
information is enabled, but this can be inhibited with the negated
form <samp><span class="option">-fno-working-directory</span></samp>. If the <samp><span class="option">-P</span></samp> flag is
present in the command line, this option has no effect, since no
<code>#line</code> directives are emitted whatsoever.
<br><dt><code>-fno-show-column</code><dd><a name="index-fno_002dshow_002dcolumn-181"></a>Do not print column numbers in diagnostics. This may be necessary if
diagnostics are being scanned by a program that does not understand the
column numbers, such as <samp><span class="command">dejagnu</span></samp>.
<br><dt><code>-A </code><var>predicate</var><code>=</code><var>answer</var><dd><a name="index-A-182"></a>Make an assertion with the predicate <var>predicate</var> and answer
<var>answer</var>. This form is preferred to the older form <samp><span class="option">-A
</span><var>predicate</var><span class="option">(</span><var>answer</var><span class="option">)</span></samp>, which is still supported, because
it does not use shell special characters.
See <a href="#Obsolete-Features">Obsolete Features</a>.
<br><dt><code>-A -</code><var>predicate</var><code>=</code><var>answer</var><dd>Cancel an assertion with the predicate <var>predicate</var> and answer
<var>answer</var>.
<br><dt><code>-dCHARS</code><dd><var>CHARS</var> is a sequence of one or more of the following characters,
and must not be preceded by a space. Other characters are interpreted
by the compiler proper, or reserved for future versions of GCC, and so
are silently ignored. If you specify characters whose behavior
conflicts, the result is undefined.
<dl>
<dt>‘<samp><span class="samp">M</span></samp>’<dd><a name="index-dM-183"></a>Instead of the normal output, generate a list of ‘<samp><span class="samp">#define</span></samp>’
directives for all the macros defined during the execution of the
preprocessor, including predefined macros. This gives you a way of
finding out what is predefined in your version of the preprocessor.
Assuming you have no file <samp><span class="file">foo.h</span></samp>, the command
<pre class="smallexample"> touch foo.h; cpp -dM foo.h
</pre>
<p class="noindent">will show all the predefined macros.
<p>If you use <samp><span class="option">-dM</span></samp> without the <samp><span class="option">-E</span></samp> option, <samp><span class="option">-dM</span></samp> is
interpreted as a synonym for <samp><span class="option">-fdump-rtl-mach</span></samp>.
See <a href="gcc.html#Debugging-Options">Debugging Options</a>.
<br><dt>‘<samp><span class="samp">D</span></samp>’<dd><a name="index-dD-184"></a>Like ‘<samp><span class="samp">M</span></samp>’ except in two respects: it does <em>not</em> include the
predefined macros, and it outputs <em>both</em> the ‘<samp><span class="samp">#define</span></samp>’
directives and the result of preprocessing. Both kinds of output go to
the standard output file.
<br><dt>‘<samp><span class="samp">N</span></samp>’<dd><a name="index-dN-185"></a>Like ‘<samp><span class="samp">D</span></samp>’, but emit only the macro names, not their expansions.
<br><dt>‘<samp><span class="samp">I</span></samp>’<dd><a name="index-dI-186"></a>Output ‘<samp><span class="samp">#include</span></samp>’ directives in addition to the result of
preprocessing.
<br><dt>‘<samp><span class="samp">U</span></samp>’<dd><a name="index-dU-187"></a>Like ‘<samp><span class="samp">D</span></samp>’ except that only macros that are expanded, or whose
definedness is tested in preprocessor directives, are output; the
output is delayed until the use or test of the macro; and
‘<samp><span class="samp">#undef</span></samp>’ directives are also output for macros tested but
undefined at the time.
</dl>
<br><dt><code>-P</code><dd><a name="index-P-188"></a>Inhibit generation of linemarkers in the output from the preprocessor.
This might be useful when running the preprocessor on something that is
not C code, and will be sent to a program which might be confused by the
linemarkers.
See <a href="#Preprocessor-Output">Preprocessor Output</a>.
<br><dt><code>-C</code><dd><a name="index-C-189"></a>Do not discard comments. All comments are passed through to the output
file, except for comments in processed directives, which are deleted
along with the directive.
<p>You should be prepared for side effects when using <samp><span class="option">-C</span></samp>; it
causes the preprocessor to treat comments as tokens in their own right.
For example, comments appearing at the start of what would be a
directive line have the effect of turning that line into an ordinary
source line, since the first token on the line is no longer a ‘<samp><span class="samp">#</span></samp>’.
<br><dt><code>-CC</code><dd>Do not discard comments, including during macro expansion. This is
like <samp><span class="option">-C</span></samp>, except that comments contained within macros are
also passed through to the output file where the macro is expanded.
<p>In addition to the side-effects of the <samp><span class="option">-C</span></samp> option, the
<samp><span class="option">-CC</span></samp> option causes all C++-style comments inside a macro
to be converted to C-style comments. This is to prevent later use
of that macro from inadvertently commenting out the remainder of
the source line.
<p>The <samp><span class="option">-CC</span></samp> option is generally used to support lint comments.
<br><dt><code>-traditional-cpp</code><dd><a name="index-traditional_002dcpp-190"></a>Try to imitate the behavior of old-fashioned C preprocessors, as
opposed to ISO C preprocessors.
See <a href="#Traditional-Mode">Traditional Mode</a>.
<br><dt><code>-trigraphs</code><dd><a name="index-trigraphs-191"></a>Process trigraph sequences.
See <a href="#Initial-processing">Initial processing</a>.
<br><dt><code>-remap</code><dd><a name="index-remap-192"></a>Enable special code to work around file systems which only permit very
short file names, such as MS-DOS.
<dt><code>--help</code><dt><code>--target-help</code><dd><a name="index-help-193"></a><a name="index-target_002dhelp-194"></a>Print text describing all the command line options instead of
preprocessing anything.
<br><dt><code>-v</code><dd><a name="index-v-195"></a>Verbose mode. Print out GNU CPP's version number at the beginning of
execution, and report the final form of the include path.
<br><dt><code>-H</code><dd><a name="index-H-196"></a>Print the name of each header file used, in addition to other normal
activities. Each name is indented to show how deep in the
‘<samp><span class="samp">#include</span></samp>’ stack it is. Precompiled header files are also
printed, even if they are found to be invalid; an invalid precompiled
header file is printed with ‘<samp><span class="samp">...x</span></samp>’ and a valid one with ‘<samp><span class="samp">...!</span></samp>’ .
<br><dt><code>-version</code><dt><code>--version</code><dd><a name="index-version-197"></a>Print out GNU CPP's version number. With one dash, proceed to
preprocess as normal. With two dashes, exit immediately.
</dl>
<!-- man end -->
<div class="node">
<a name="Environment-Variables"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#GNU-Free-Documentation-License">GNU Free Documentation License</a>,
Previous: <a rel="previous" accesskey="p" href="#Invocation">Invocation</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="chapter">13 Environment Variables</h2>
<p><a name="index-environment-variables-198"></a><!-- man begin ENVIRONMENT -->
<p>This section describes the environment variables that affect how CPP
operates. You can use them to specify directories or prefixes to use
when searching for include files, or to control dependency output.
<p>Note that you can also specify places to search using options such as
<samp><span class="option">-I</span></samp>, and control dependency output with options like
<samp><span class="option">-M</span></samp> (see <a href="#Invocation">Invocation</a>). These take precedence over
environment variables, which in turn take precedence over the
configuration of GCC.
<!-- Copyright (c) 1999, 2000, 2001, 2002, 2004 -->
<!-- Free Software Foundation, Inc. -->
<!-- This is part of the CPP and GCC manuals. -->
<!-- For copying conditions, see the file gcc.texi. -->
<!-- -->
<!-- Environment variables affecting the preprocessor -->
<!-- -->
<!-- If this file is included with the flag ``cppmanual'' set, it is -->
<!-- formatted for inclusion in the CPP manual; otherwise the main GCC manual. -->
<dl>
<dt><samp><span class="env">CPATH</span></samp><a name="index-CPATH-199"></a><dt><samp><span class="env">C_INCLUDE_PATH</span></samp><a name="index-C_005fINCLUDE_005fPATH-200"></a><dt><samp><span class="env">CPLUS_INCLUDE_PATH</span></samp><a name="index-CPLUS_005fINCLUDE_005fPATH-201"></a><dt><samp><span class="env">OBJC_INCLUDE_PATH</span></samp><a name="index-OBJC_005fINCLUDE_005fPATH-202"></a><dd><!-- Commented out until ObjC++ is part of GCC: -->
<!-- @itemx OBJCPLUS_INCLUDE_PATH -->
Each variable's value is a list of directories separated by a special
character, much like <samp><span class="env">PATH</span></samp>, in which to look for header files.
The special character, <code>PATH_SEPARATOR</code>, is target-dependent and
determined at GCC build time. For Microsoft Windows-based targets it is a
semicolon, and for almost all other targets it is a colon.
<p><samp><span class="env">CPATH</span></samp> specifies a list of directories to be searched as if
specified with <samp><span class="option">-I</span></samp>, but after any paths given with <samp><span class="option">-I</span></samp>
options on the command line. This environment variable is used
regardless of which language is being preprocessed.
<p>The remaining environment variables apply only when preprocessing the
particular language indicated. Each specifies a list of directories
to be searched as if specified with <samp><span class="option">-isystem</span></samp>, but after any
paths given with <samp><span class="option">-isystem</span></samp> options on the command line.
<p>In all these variables, an empty element instructs the compiler to
search its current working directory. Empty elements can appear at the
beginning or end of a path. For instance, if the value of
<samp><span class="env">CPATH</span></samp> is <code>:/special/include</code>, that has the same
effect as ‘<samp><span class="samp">-I. -I/special/include<!-- /@w --></span></samp>’.
<!-- man end -->
<p>See also <a href="#Search-Path">Search Path</a>.
<!-- man begin ENVIRONMENT -->
<br><dt><samp><span class="env">DEPENDENCIES_OUTPUT</span></samp><a name="index-DEPENDENCIES_005fOUTPUT-203"></a><dd><a name="index-dependencies-for-make-as-output-204"></a>If this variable is set, its value specifies how to output
dependencies for Make based on the non-system header files processed
by the compiler. System header files are ignored in the dependency
output.
<p>The value of <samp><span class="env">DEPENDENCIES_OUTPUT</span></samp> can be just a file name, in
which case the Make rules are written to that file, guessing the target
name from the source file name. Or the value can have the form
‘<samp><var>file</var> <var>target</var></samp>’, in which case the rules are written to
file <var>file</var> using <var>target</var> as the target name.
<p>In other words, this environment variable is equivalent to combining
the options <samp><span class="option">-MM</span></samp> and <samp><span class="option">-MF</span></samp>
(see <a href="#Invocation">Invocation</a>),
with an optional <samp><span class="option">-MT</span></samp> switch too.
<br><dt><samp><span class="env">SUNPRO_DEPENDENCIES</span></samp><a name="index-SUNPRO_005fDEPENDENCIES-205"></a><dd><a name="index-dependencies-for-make-as-output-206"></a>This variable is the same as <samp><span class="env">DEPENDENCIES_OUTPUT</span></samp> (see above),
except that system header files are not ignored, so it implies
<samp><span class="option">-M</span></samp> rather than <samp><span class="option">-MM</span></samp>. However, the dependence on the
main input file is omitted.
See <a href="#Invocation">Invocation</a>.
</dl>
<!-- man end -->
<!-- Special handling for inclusion in the install manual. -->
<!-- man begin DESCRIPTION -->
<div class="node">
<a name="GNU-Free-Documentation-License"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Index-of-Directives">Index of Directives</a>,
Previous: <a rel="previous" accesskey="p" href="#Environment-Variables">Environment Variables</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="unnumbered">GNU Free Documentation License</h2>
<p><a name="index-FDL_002c-GNU-Free-Documentation-License-207"></a><div align="center">Version 1.3, 3 November 2008</div>
<pre class="display"> Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
<a href="http://fsf.org/">http://fsf.org/</a>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
</pre>
<ol type=1 start=0>
<li>PREAMBLE
<p>The purpose of this License is to make a manual, textbook, or other
functional and useful document <dfn>free</dfn> in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.
<p>This License is a kind of “copyleft”, which means that derivative
works of the document must themselves be free in the same sense. It
complements the GNU General Public License, which is a copyleft
license designed for free software.
<p>We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does. But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License
principally for works whose purpose is instruction or reference.
<li>APPLICABILITY AND DEFINITIONS
<p>This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License. Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein. The “Document”, below,
refers to any such manual or work. Any member of the public is a
licensee, and is addressed as “you”. You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.
<p>A “Modified Version” of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
<p>A “Secondary Section” is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could fall
directly within that overall subject. (Thus, if the Document is in
part a textbook of mathematics, a Secondary Section may not explain
any mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
<p>The “Invariant Sections” are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License. If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant. The Document may contain zero
Invariant Sections. If the Document does not identify any Invariant
Sections then there are none.
<p>The “Cover Texts” are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License. A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.
<p>A “Transparent” copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text. A copy that is not “Transparent” is called “Opaque”.
<p>Examples of suitable formats for Transparent copies include plain
<span class="sc">ascii</span> without markup, Texinfo input format, LaTeX input
format, <acronym>SGML</acronym> or <acronym>XML</acronym> using a publicly available
<acronym>DTD</acronym>, and standard-conforming simple <acronym>HTML</acronym>,
PostScript or <acronym>PDF</acronym> designed for human modification. Examples
of transparent image formats include <acronym>PNG</acronym>, <acronym>XCF</acronym> and
<acronym>JPG</acronym>. Opaque formats include proprietary formats that can be
read and edited only by proprietary word processors, <acronym>SGML</acronym> or
<acronym>XML</acronym> for which the <acronym>DTD</acronym> and/or processing tools are
not generally available, and the machine-generated <acronym>HTML</acronym>,
PostScript or <acronym>PDF</acronym> produced by some word processors for
output purposes only.
<p>The “Title Page” means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page. For works in
formats which do not have any title page as such, “Title Page” means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
<p>The “publisher” means any person or entity that distributes copies
of the Document to the public.
<p>A section “Entitled XYZ” means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
specific section name mentioned below, such as “Acknowledgements”,
“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title”
of such a section when you modify the Document means that it remains a
section “Entitled XYZ” according to this definition.
<p>The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document. These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.
<li>VERBATIM COPYING
<p>You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough
number of copies you must also follow the conditions in section 3.
<p>You may also lend copies, under the same conditions stated above, and
you may publicly display copies.
<li>COPYING IN QUANTITY
<p>If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
the full title with all words of the title equally prominent and
visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.
<p>If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.
<p>If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.
<p>It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.
<li>MODIFICATIONS
<p>You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified Version:
<ol type=A start=1>
<li>Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document). You may use the same title as a previous version
if the original publisher of that version gives permission.
<li>List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.
<li>State on the Title page the name of the publisher of the
Modified Version, as the publisher.
<li>Preserve all the copyright notices of the Document.
<li>Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
<li>Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.
<li>Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
<li>Include an unaltered copy of this License.
<li>Preserve the section Entitled “History”, Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
there is no section Entitled “History” in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
<li>Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on. These may be placed in the “History” section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
<li>For any section Entitled “Acknowledgements” or “Dedications”, Preserve
the Title of the section, and preserve in the section all the
substance and tone of each of the contributor acknowledgements and/or
dedications given therein.
<li>Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
<li>Delete any section Entitled “Endorsements”. Such a section
may not be included in the Modified Version.
<li>Do not retitle any existing section to be Entitled “Endorsements” or
to conflict in title with any Invariant Section.
<li>Preserve any Warranty Disclaimers.
</ol>
<p>If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
<p>You may add a section Entitled “Endorsements”, provided it contains
nothing but endorsements of your Modified Version by various
parties—for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.
<p>You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version. Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.
<p>The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.
<li>COMBINING DOCUMENTS
<p>You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.
<p>The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
<p>In the combination, you must combine any sections Entitled “History”
in the various original documents, forming one section Entitled
“History”; likewise combine any sections Entitled “Acknowledgements”,
and any sections Entitled “Dedications”. You must delete all
sections Entitled “Endorsements.”
<li>COLLECTIONS OF DOCUMENTS
<p>You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
<p>You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.
<li>AGGREGATION WITH INDEPENDENT WORKS
<p>A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an “aggregate” if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.
<p>If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.
<li>TRANSLATION
<p>Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers. In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.
<p>If a section in the Document is Entitled “Acknowledgements”,
“Dedications”, or “History”, the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.
<li>TERMINATION
<p>You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.
<p>However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
<p>Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
<p>Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
<li>FUTURE REVISIONS OF THIS LICENSE
<p>The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
<a href="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</a>.
<p>Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License “or any later version” applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
<li>RELICENSING
<p>“Massive Multiauthor Collaboration Site” (or “MMC Site”) means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
“Massive Multiauthor Collaboration” (or “MMC”) contained in the
site means any set of copyrightable works thus published on the MMC
site.
<p>“CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
<p>“Incorporate” means to publish or republish a Document, in whole or
in part, as part of another Document.
<p>An MMC is “eligible for relicensing” if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole
or in part into the MMC, (1) had no cover texts or invariant sections,
and (2) were thus incorporated prior to November 1, 2008.
<p>The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
</ol>
<h3 class="unnumberedsec">ADDENDUM: How to use this License for your documents</h3>
<p>To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:
<pre class="smallexample"> Copyright (C) <var>year</var> <var>your name</var>.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
</pre>
<p>If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the “with...Texts.” line with this:
<pre class="smallexample"> with the Invariant Sections being <var>list their titles</var>, with
the Front-Cover Texts being <var>list</var>, and with the Back-Cover Texts
being <var>list</var>.
</pre>
<p>If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
<p>If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.
<!-- Local Variables: -->
<!-- ispell-local-pdict: "ispell-dict" -->
<!-- End: -->
<!-- man end -->
<div class="node">
<a name="Index-of-Directives"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Option-Index">Option Index</a>,
Previous: <a rel="previous" accesskey="p" href="#GNU-Free-Documentation-License">GNU Free Documentation License</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="unnumbered">Index of Directives</h2>
<ul class="index-fn" compact>
<li><a href="#index-g_t_0023assert-114"><code>#assert</code></a>: <a href="#Obsolete-Features">Obsolete Features</a></li>
<li><a href="#index-g_t_0023define-44"><code>#define</code></a>: <a href="#Object_002dlike-Macros">Object-like Macros</a></li>
<li><a href="#index-g_t_0023elif-91"><code>#elif</code></a>: <a href="#Elif">Elif</a></li>
<li><a href="#index-g_t_0023else-90"><code>#else</code></a>: <a href="#Else">Else</a></li>
<li><a href="#index-g_t_0023endif-86"><code>#endif</code></a>: <a href="#Ifdef">Ifdef</a></li>
<li><a href="#index-g_t_0023error-96"><code>#error</code></a>: <a href="#Diagnostics">Diagnostics</a></li>
<li><a href="#index-g_t_0023ident-104"><code>#ident</code></a>: <a href="#Other-Directives">Other Directives</a></li>
<li><a href="#index-g_t_0023if-84"><code>#if</code></a>: <a href="#Conditional-Syntax">Conditional Syntax</a></li>
<li><a href="#index-g_t_0023ifdef-85"><code>#ifdef</code></a>: <a href="#Ifdef">Ifdef</a></li>
<li><a href="#index-g_t_0023ifndef-88"><code>#ifndef</code></a>: <a href="#Ifdef">Ifdef</a></li>
<li><a href="#index-g_t_0023import-33"><code>#import</code></a>: <a href="#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a></li>
<li><a href="#index-g_t_0023include-27"><code>#include</code></a>: <a href="#Include-Syntax">Include Syntax</a></li>
<li><a href="#index-g_t_0023include_005fnext-38"><code>#include_next</code></a>: <a href="#Wrapper-Headers">Wrapper Headers</a></li>
<li><a href="#index-g_t_0023line-99"><code>#line</code></a>: <a href="#Line-Control">Line Control</a></li>
<li><a href="#index-g_t_0023pragma-GCC-dependency-101"><code>#pragma GCC dependency</code></a>: <a href="#Pragmas">Pragmas</a></li>
<li><a href="#index-g_t_0023pragma-GCC-poison-102"><code>#pragma GCC poison</code></a>: <a href="#Pragmas">Pragmas</a></li>
<li><a href="#index-g_t_0023pragma-GCC-system_005fheader-103"><code>#pragma GCC system_header</code></a>: <a href="#Pragmas">Pragmas</a></li>
<li><a href="#index-g_t_0023pragma-GCC-system_005fheader-40"><code>#pragma GCC system_header</code></a>: <a href="#System-Headers">System Headers</a></li>
<li><a href="#index-g_t_0023sccs-105"><code>#sccs</code></a>: <a href="#Other-Directives">Other Directives</a></li>
<li><a href="#index-g_t_0023unassert-116"><code>#unassert</code></a>: <a href="#Obsolete-Features">Obsolete Features</a></li>
<li><a href="#index-g_t_0023undef-70"><code>#undef</code></a>: <a href="#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a></li>
<li><a href="#index-g_t_0023warning-97"><code>#warning</code></a>: <a href="#Diagnostics">Diagnostics</a></li>
</ul><div class="node">
<a name="Option-Index"></a>
<p><hr>
Next: <a rel="next" accesskey="n" href="#Concept-Index">Concept Index</a>,
Previous: <a rel="previous" accesskey="p" href="#Index-of-Directives">Index of Directives</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="unnumbered">Option Index</h2>
<p class="noindent">CPP's command line options and environment variables are indexed here
without any initial ‘<samp><span class="samp">-</span></samp>’ or ‘<samp><span class="samp">--</span></samp>’.
<ul class="index-op" compact>
<li><a href="#index-A-182"><code>A</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-ansi-153"><code>ansi</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-C-189"><code>C</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-C_005fINCLUDE_005fPATH-200"><code>C_INCLUDE_PATH</code></a>: <a href="#Environment-Variables">Environment Variables</a></li>
<li><a href="#index-CPATH-199"><code>CPATH</code></a>: <a href="#Environment-Variables">Environment Variables</a></li>
<li><a href="#index-CPLUS_005fINCLUDE_005fPATH-201"><code>CPLUS_INCLUDE_PATH</code></a>: <a href="#Environment-Variables">Environment Variables</a></li>
<li><a href="#index-D-123"><code>D</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-dD-184"><code>dD</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-DEPENDENCIES_005fOUTPUT-203"><code>DEPENDENCIES_OUTPUT</code></a>: <a href="#Environment-Variables">Environment Variables</a></li>
<li><a href="#index-dI-186"><code>dI</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-dM-183"><code>dM</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-dN-185"><code>dN</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-dU-187"><code>dU</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-fdirectives_002donly-168"><code>fdirectives-only</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-fdollars_002din_002didentifiers-169"><code>fdollars-in-identifiers</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-fexec_002dcharset-173"><code>fexec-charset</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-fextended_002didentifiers-170"><code>fextended-identifiers</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-finput_002dcharset-177"><code>finput-charset</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-fno_002dshow_002dcolumn-181"><code>fno-show-column</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-fno_002dworking_002ddirectory-180"><code>fno-working-directory</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-fpreprocessed-171"><code>fpreprocessed</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-ftabstop-172"><code>ftabstop</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-fwide_002dexec_002dcharset-175"><code>fwide-exec-charset</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-fworking_002ddirectory-179"><code>fworking-directory</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-H-196"><code>H</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-help-193"><code>help</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-I-126"><code>I</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-I_002d-155"><code>I-</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-idirafter-160"><code>idirafter</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-imacros-159"><code>imacros</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-imultilib-165"><code>imultilib</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-include-158"><code>include</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-iprefix-161"><code>iprefix</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-iquote-167"><code>iquote</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-isysroot-164"><code>isysroot</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-isystem-166"><code>isystem</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-iwithprefix-162"><code>iwithprefix</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-iwithprefixbefore-163"><code>iwithprefixbefore</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-M-141"><code>M</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-MD-150"><code>MD</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-MF-145"><code>MF</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-MG-146"><code>MG</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-MM-144"><code>MM</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-MMD-151"><code>MMD</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-MP-147"><code>MP</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-MQ-149"><code>MQ</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-MT-148"><code>MT</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-nostdinc-156"><code>nostdinc</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-nostdinc_002b_002b-157"><code>nostdinc++</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-o-127"><code>o</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-OBJC_005fINCLUDE_005fPATH-202"><code>OBJC_INCLUDE_PATH</code></a>: <a href="#Environment-Variables">Environment Variables</a></li>
<li><a href="#index-P-188"><code>P</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-pedantic-139"><code>pedantic</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-pedantic_002derrors-140"><code>pedantic-errors</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-remap-192"><code>remap</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-std_003d-154"><code>std=</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-SUNPRO_005fDEPENDENCIES-205"><code>SUNPRO_DEPENDENCIES</code></a>: <a href="#Environment-Variables">Environment Variables</a></li>
<li><a href="#index-target_002dhelp-194"><code>target-help</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-traditional_002dcpp-190"><code>traditional-cpp</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-trigraphs-191"><code>trigraphs</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-U-124"><code>U</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-undef-125"><code>undef</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-v-195"><code>v</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-version-197"><code>version</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-w-138"><code>w</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Wall-128"><code>Wall</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Wcomment-129"><code>Wcomment</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Wcomments-130"><code>Wcomments</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Wendif_002dlabels-135"><code>Wendif-labels</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Werror-136"><code>Werror</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Wsystem_002dheaders-137"><code>Wsystem-headers</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Wtraditional-132"><code>Wtraditional</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Wtrigraphs-131"><code>Wtrigraphs</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Wundef-133"><code>Wundef</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-Wunused_002dmacros-134"><code>Wunused-macros</code></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-x-152"><code>x</code></a>: <a href="#Invocation">Invocation</a></li>
</ul><div class="node">
<a name="Concept-Index"></a>
<p><hr>
Previous: <a rel="previous" accesskey="p" href="#Option-Index">Option Index</a>,
Up: <a rel="up" accesskey="u" href="#Top">Top</a>
</div>
<h2 class="unnumbered">Concept Index</h2>
<ul class="index-cp" compact>
<li><a href="#index-g_t_0040samp_007b_0023_007d-operator-51">‘<samp><span class="samp">#</span></samp>’ operator</a>: <a href="#Stringification">Stringification</a></li>
<li><a href="#index-g_t_0040samp_007b_0023_0023_007d-operator-55">‘<samp><span class="samp">##</span></samp>’ operator</a>: <a href="#Concatenation">Concatenation</a></li>
<li><a href="#index-g_t_0040code_007b_005fPragma_007d-100"><code>_Pragma</code></a>: <a href="#Pragmas">Pragmas</a></li>
<li><a href="#index-alternative-tokens-19">alternative tokens</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-arguments-46">arguments</a>: <a href="#Macro-Arguments">Macro Arguments</a></li>
<li><a href="#index-arguments-in-macro-definitions-48">arguments in macro definitions</a>: <a href="#Macro-Arguments">Macro Arguments</a></li>
<li><a href="#index-assertions-111">assertions</a>: <a href="#Obsolete-Features">Obsolete Features</a></li>
<li><a href="#index-assertions_002c-canceling-115">assertions, canceling</a>: <a href="#Obsolete-Features">Obsolete Features</a></li>
<li><a href="#index-backslash_002dnewline-4">backslash-newline</a>: <a href="#Initial-processing">Initial processing</a></li>
<li><a href="#index-block-comments-7">block comments</a>: <a href="#Initial-processing">Initial processing</a></li>
<li><a href="#index-C_002b_002b-named-operators-66">C++ named operators</a>: <a href="#C_002b_002b-Named-Operators">C++ Named Operators</a></li>
<li><a href="#index-character-constants-15">character constants</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-character-set_002c-execution-174">character set, execution</a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-character-set_002c-input-178">character set, input</a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-character-set_002c-wide-execution-176">character set, wide execution</a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-command-line-119">command line</a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-commenting-out-code-92">commenting out code</a>: <a href="#Deleted-Code">Deleted Code</a></li>
<li><a href="#index-comments-5">comments</a>: <a href="#Initial-processing">Initial processing</a></li>
<li><a href="#index-common-predefined-macros-61">common predefined macros</a>: <a href="#Common-Predefined-Macros">Common Predefined Macros</a></li>
<li><a href="#index-computed-includes-34">computed includes</a>: <a href="#Computed-Includes">Computed Includes</a></li>
<li><a href="#index-concatenation-52">concatenation</a>: <a href="#Concatenation">Concatenation</a></li>
<li><a href="#index-conditional-group-87">conditional group</a>: <a href="#Ifdef">Ifdef</a></li>
<li><a href="#index-conditionals-83">conditionals</a>: <a href="#Conditionals">Conditionals</a></li>
<li><a href="#index-continued-lines-3">continued lines</a>: <a href="#Initial-processing">Initial processing</a></li>
<li><a href="#index-controlling-macro-31">controlling macro</a>: <a href="#Once_002dOnly-Headers">Once-Only Headers</a></li>
<li><a href="#index-g_t_0040code_007bdefined_007d-89"><code>defined</code></a>: <a href="#Defined">Defined</a></li>
<li><a href="#index-dependencies-for-make-as-output-204">dependencies for make as output</a>: <a href="#Environment-Variables">Environment Variables</a></li>
<li><a href="#index-dependencies_002c-_0040command_007bmake_007d-143">dependencies, <samp><span class="command">make</span></samp></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-diagnostic-93">diagnostic</a>: <a href="#Diagnostics">Diagnostics</a></li>
<li><a href="#index-differences-from-previous-versions-117">differences from previous versions</a>: <a href="#Differences-from-previous-versions">Differences from previous versions</a></li>
<li><a href="#index-digraphs-18">digraphs</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-directive-line-23">directive line</a>: <a href="#The-preprocessing-language">The preprocessing language</a></li>
<li><a href="#index-directive-name-24">directive name</a>: <a href="#The-preprocessing-language">The preprocessing language</a></li>
<li><a href="#index-directives-21">directives</a>: <a href="#The-preprocessing-language">The preprocessing language</a></li>
<li><a href="#index-empty-macro-arguments-49">empty macro arguments</a>: <a href="#Macro-Arguments">Macro Arguments</a></li>
<li><a href="#index-environment-variables-198">environment variables</a>: <a href="#Environment-Variables">Environment Variables</a></li>
<li><a href="#index-expansion-of-arguments-79">expansion of arguments</a>: <a href="#Argument-Prescan">Argument Prescan</a></li>
<li><a href="#index-FDL_002c-GNU-Free-Documentation-License-207">FDL, GNU Free Documentation License</a>: <a href="#GNU-Free-Documentation-License">GNU Free Documentation License</a></li>
<li><a href="#index-function_002dlike-macros-45">function-like macros</a>: <a href="#Function_002dlike-Macros">Function-like Macros</a></li>
<li><a href="#index-grouping-options-120">grouping options</a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-guard-macro-32">guard macro</a>: <a href="#Once_002dOnly-Headers">Once-Only Headers</a></li>
<li><a href="#index-header-file-25">header file</a>: <a href="#Header-Files">Header Files</a></li>
<li><a href="#index-header-file-names-16">header file names</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-identifiers-10">identifiers</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-implementation-limits-110">implementation limits</a>: <a href="#Implementation-limits">Implementation limits</a></li>
<li><a href="#index-implementation_002ddefined-behavior-109">implementation-defined behavior</a>: <a href="#Implementation_002ddefined-behavior">Implementation-defined behavior</a></li>
<li><a href="#index-including-just-once-29">including just once</a>: <a href="#Once_002dOnly-Headers">Once-Only Headers</a></li>
<li><a href="#index-invocation-118">invocation</a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-g_t_0040file_007biso646_002eh_007d-67"><samp><span class="file">iso646.h</span></samp></a>: <a href="#C_002b_002b-Named-Operators">C++ Named Operators</a></li>
<li><a href="#index-line-comments-6">line comments</a>: <a href="#Initial-processing">Initial processing</a></li>
<li><a href="#index-line-control-98">line control</a>: <a href="#Line-Control">Line Control</a></li>
<li><a href="#index-line-endings-1">line endings</a>: <a href="#Initial-processing">Initial processing</a></li>
<li><a href="#index-linemarkers-108">linemarkers</a>: <a href="#Preprocessor-Output">Preprocessor Output</a></li>
<li><a href="#index-macro-argument-expansion-80">macro argument expansion</a>: <a href="#Argument-Prescan">Argument Prescan</a></li>
<li><a href="#index-macro-arguments-and-directives-71">macro arguments and directives</a>: <a href="#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a></li>
<li><a href="#index-macros-in-include-35">macros in include</a>: <a href="#Computed-Includes">Computed Includes</a></li>
<li><a href="#index-macros-with-arguments-47">macros with arguments</a>: <a href="#Macro-Arguments">Macro Arguments</a></li>
<li><a href="#index-macros-with-variable-arguments-57">macros with variable arguments</a>: <a href="#Variadic-Macros">Variadic Macros</a></li>
<li><a href="#index-g_t_0040command_007bmake_007d-142"><samp><span class="command">make</span></samp></a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-manifest-constants-43">manifest constants</a>: <a href="#Object_002dlike-Macros">Object-like Macros</a></li>
<li><a href="#index-named-operators-65">named operators</a>: <a href="#C_002b_002b-Named-Operators">C++ Named Operators</a></li>
<li><a href="#index-newlines-in-macro-arguments-82">newlines in macro arguments</a>: <a href="#Newlines-in-Arguments">Newlines in Arguments</a></li>
<li><a href="#index-null-directive-106">null directive</a>: <a href="#Other-Directives">Other Directives</a></li>
<li><a href="#index-numbers-11">numbers</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-object_002dlike-macro-41">object-like macro</a>: <a href="#Object_002dlike-Macros">Object-like Macros</a></li>
<li><a href="#index-options-122">options</a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-options_002c-grouping-121">options, grouping</a>: <a href="#Invocation">Invocation</a></li>
<li><a href="#index-other-tokens-20">other tokens</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-output-format-107">output format</a>: <a href="#Preprocessor-Output">Preprocessor Output</a></li>
<li><a href="#index-overriding-a-header-file-37">overriding a header file</a>: <a href="#Wrapper-Headers">Wrapper Headers</a></li>
<li><a href="#index-parentheses-in-macro-bodies-74">parentheses in macro bodies</a>: <a href="#Operator-Precedence-Problems">Operator Precedence Problems</a></li>
<li><a href="#index-pitfalls-of-macros-73">pitfalls of macros</a>: <a href="#Macro-Pitfalls">Macro Pitfalls</a></li>
<li><a href="#index-predefined-macros-59">predefined macros</a>: <a href="#Predefined-Macros">Predefined Macros</a></li>
<li><a href="#index-predefined-macros_002c-system_002dspecific-63">predefined macros, system-specific</a>: <a href="#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a></li>
<li><a href="#index-predicates-112">predicates</a>: <a href="#Obsolete-Features">Obsolete Features</a></li>
<li><a href="#index-preprocessing-directives-22">preprocessing directives</a>: <a href="#The-preprocessing-language">The preprocessing language</a></li>
<li><a href="#index-preprocessing-numbers-12">preprocessing numbers</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-preprocessing-tokens-9">preprocessing tokens</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-prescan-of-macro-arguments-81">prescan of macro arguments</a>: <a href="#Argument-Prescan">Argument Prescan</a></li>
<li><a href="#index-problems-with-macros-72">problems with macros</a>: <a href="#Macro-Pitfalls">Macro Pitfalls</a></li>
<li><a href="#index-punctuators-17">punctuators</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-redefining-macros-69">redefining macros</a>: <a href="#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a></li>
<li><a href="#index-repeated-inclusion-28">repeated inclusion</a>: <a href="#Once_002dOnly-Headers">Once-Only Headers</a></li>
<li><a href="#index-reporting-errors-94">reporting errors</a>: <a href="#Diagnostics">Diagnostics</a></li>
<li><a href="#index-reporting-warnings-95">reporting warnings</a>: <a href="#Diagnostics">Diagnostics</a></li>
<li><a href="#index-reserved-namespace-64">reserved namespace</a>: <a href="#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a></li>
<li><a href="#index-self_002dreference-78">self-reference</a>: <a href="#Self_002dReferential-Macros">Self-Referential Macros</a></li>
<li><a href="#index-semicolons-_0028after-macro-calls_0029-75">semicolons (after macro calls)</a>: <a href="#Swallowing-the-Semicolon">Swallowing the Semicolon</a></li>
<li><a href="#index-side-effects-_0028in-macro-arguments_0029-76">side effects (in macro arguments)</a>: <a href="#Duplication-of-Side-Effects">Duplication of Side Effects</a></li>
<li><a href="#index-standard-predefined-macros_002e-60">standard predefined macros.</a>: <a href="#Standard-Predefined-Macros">Standard Predefined Macros</a></li>
<li><a href="#index-string-constants-14">string constants</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-string-literals-13">string literals</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-stringification-50">stringification</a>: <a href="#Stringification">Stringification</a></li>
<li><a href="#index-symbolic-constants-42">symbolic constants</a>: <a href="#Object_002dlike-Macros">Object-like Macros</a></li>
<li><a href="#index-system-header-files-39">system header files</a>: <a href="#System-Headers">System Headers</a></li>
<li><a href="#index-system-header-files-26">system header files</a>: <a href="#Header-Files">Header Files</a></li>
<li><a href="#index-system_002dspecific-predefined-macros-62">system-specific predefined macros</a>: <a href="#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a></li>
<li><a href="#index-testing-predicates-113">testing predicates</a>: <a href="#Obsolete-Features">Obsolete Features</a></li>
<li><a href="#index-token-concatenation-54">token concatenation</a>: <a href="#Concatenation">Concatenation</a></li>
<li><a href="#index-token-pasting-53">token pasting</a>: <a href="#Concatenation">Concatenation</a></li>
<li><a href="#index-tokens-8">tokens</a>: <a href="#Tokenization">Tokenization</a></li>
<li><a href="#index-trigraphs-2">trigraphs</a>: <a href="#Initial-processing">Initial processing</a></li>
<li><a href="#index-undefining-macros-68">undefining macros</a>: <a href="#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a></li>
<li><a href="#index-unsafe-macros-77">unsafe macros</a>: <a href="#Duplication-of-Side-Effects">Duplication of Side Effects</a></li>
<li><a href="#index-variable-number-of-arguments-56">variable number of arguments</a>: <a href="#Variadic-Macros">Variadic Macros</a></li>
<li><a href="#index-variadic-macros-58">variadic macros</a>: <a href="#Variadic-Macros">Variadic Macros</a></li>
<li><a href="#index-wrapper-_0040code_007b_0023ifndef_007d-30">wrapper <code>#ifndef</code></a>: <a href="#Once_002dOnly-Headers">Once-Only Headers</a></li>
<li><a href="#index-wrapper-headers-36">wrapper headers</a>: <a href="#Wrapper-Headers">Wrapper Headers</a></li>
</ul><div class="footnote">
<hr>
<a name="texinfo-footnotes-in-document"></a><h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> UTF-16 does not meet the requirements of the C
standard for a wide character set, but the choice of 16-bit
<code>wchar_t</code> is enshrined in some system ABIs so we cannot fix
this.</p>
<p class="footnote"><small>[<a name="fn-2" href="#fnd-2">2</a>]</small> The C
standard uses the term <dfn>string literal</dfn> to refer only to what we are
calling <dfn>string constants</dfn>.</p>
<hr></div>
</body></html>
|