Cプリコンパイル、プリプロセッシング、C/C++ヘッダファイル、コンパイル制御、

135520 ワード

          ,#Pragma             ,                              。#pragma               ,    C C++          ,              。    ,               ,             。   

    

        :   #Pragma   Para   

    Para      ,           。   

    

  (1)message     。   Message               ,                    ,                 。      :   

  #Pragma   message(“    ”)   

                               。   

                          ,                      ,                      。   

                           _X86              

  #ifdef   _X86   

  #Pragma   message(“_X86   macro   activated!”)   

  #endif   

        _X86     ,                    “_ X86   macro   activated!”。                            。   

    

  (2)          pragma   code_seg。   :   

  #pragma   code_seg(   ["section-name"[,"section-class"]   ]   )   

                    ,                  。   

    

  (3)#pragma   once   (    )   

                               ,        VC6      ,                 。   

    

  (4)#pragma   hdrstop            ,            。BCB                ,                        ,               。   

             ,    A    B,    B     A  。    #pragma   startup       ,     #pragma   package(smart_init)   ,BCB              。   

    

  (5)#pragma   resource   "*.dfm"   *.dfm          。*.dfm          。   

    

  (6)#pragma   warning(   disable   :   4507   34;   once   :   4385;   error   :   164   )   #pragma   warning(disable:4507   34)   //      4507 34        

  #pragma   warning(once:4385)   //   4385             

  #pragma   warning(error:164)   //    164           。   

      pragma   warning          :   

  #pragma   warning(   push   [   ,n   ]   )   

  #pragma   warning(   pop   )   

    n        (1---4)。   

  #pragma   warning(   push   )                。   

  #pragma   warning(   push,   n)                ,          

       n。   

  #pragma   warning(   pop   )             ,              

        。  :   

  #pragma   warning(   push   )   

  #pragma   warning(   disable   :   4705   )   

  #pragma   warning(   disable   :   4706   )   

  #pragma   warning(   disable   :   4707   )   

  //.......   

  #pragma   warning(   pop   )   

          ,           (  4705,4706 4707)。   

  (7)pragma   comment(...)   

                           。   

     lib   ,            。





、    , (Project) MFC ( Windows.H、Afxwin.H) , , , 。 , 。    stdafx.cpp , , “pch”, projectname.pch。    stdafx.h 。stdafx.h project 。 , #include
"stdafx.h" , #include "stdafx. h" , projectname.pch 。    , CPP :#include "stdafx.h"。    , CPP : #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif    , , 。__FILE__ , 。   VC.NET (/Yu), .h fatal error C1010: 。 include #include "stdafx.h", , “C/C++” , “ ” 。 “ / ” “ ”。    、C/C++   C、 C++ #include <assert.h>    // #include <ctype.h>     // #include <errno.h>     // #include <float.h>     // #include <fstream.h>    // #include <iomanip.h>    // #include <iostream.h>   // #include <limits.h>    // #include <locale.h>    // #include <math.h>     // #include <stdio.h>     // #include <stdlib.h>    // #include <string.h>    // #include <strstrea.h>   // #include <time.h>     // #include <wchar.h>     // #include <wctype.h>    //    C++ ( ) #include <algorithm>    //STL #include <bitset>     //STL #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex>     // #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque>      //STL #include <exception>    // #include <fstream> #include <functional>   //STL ( ) #include <limits> #include <list>      //STL #include <map>       //STL #include <iomanip> #include <ios>       // #include <iosfwd>     // #include <iostream> #include <istream>     // #include <ostream>     // #include <queue>      //STL #include <set>       //STL #include <sstream>     // #include <stack>      //STL      #include <stdexcept>    // #include <streambuf>    // #include <string>     // #include <utility>     //STL #include <vector>     //STL #include <cwchar> #include <cwctype> using namespace std;   C99 #include <complex.h>   // #include <fenv.h>    // #include <inttypes.h>  // #include <stdbool.h>   // #include <stdint.h>   // #include <tgmath.h>   //
、    C++ , ( ) C , 。C++ C C (C , Bjarne Cpp, C Program Preprocessor )。
、    , : , 、 4 。    :#include , 。    :
#if,#ifndef,#ifdef,#endif,#undef , , , 、 。    :#pragma, , 。    :#define, , 、 、 、 。

、    : #directive tokens # , 。 , “\” , : #define Error if(error) exit(1) #define Error \ if(error) exit(1)    : #define #undef #include #ifdef #ifndef #endif #if #else #elif #else #if // #line #error #pragma    , , 。
   、    , , : #include
<iostream> // #include <iostream.h> // #include "IO.h" // #include "../file.h" //UNIX #include "/usr/local/file.h" //UNIX #include "..\file.h" //Dos #include "\usr\local\file.h" //Dos    2 :   1、 <iostream> <iostream.h>    <iostream>, <iostream.h>: ,.h 98 9 , , 。 ,iostream.h ,iostream / 。 , iostream , 。 ,iostream namespace std , 。   2、<io.h> "io.h"    : #include <io.h> , #include "io.h" , 。
   、    , , 、 。 , :   
1、 identifier ,your code , 。 #ifdef identifier your code #endif   2、 identifier ,your code , 。 #ifndef identifier your code #endif   3、 expression ,your code , 。 #if expression your code #endif   4、 identifier ,your code1 , your code2 。 #ifdef identifier your code1 #else your code2 #endif   5、 epression1 , your code1, , expression2 , your code2, , your code3。 #if expressin1 your code1 #elif expression2 your code2 #else your code3 #enif    , 3 :#line、#error、#pragma, 。 #line : #line number filename#line 30 a.h    , a.h 。 , 30, a.h。 , , , , C++ , , , , 。 #error : #error info : #ifndef UNIX #error This software requires the UNIX OS. #endif    , , UNIX , This software requires the UNIX OS. 。 , 。 #pragma , 。 VC++#pragma comment(lib,"dllTest.lib") dllTest.lib。
   、    , , , 4 : __FILE__ __LINE__ __DATE__ , :
"25 Jan 2006" __TIME__ , : "12:30:55"    :cout<<"The file is :"<<__FILE__"<<"! The lines is:"<<__LINE__<<endl;
、    #include , 。C++ #include , namespace , , #include , #include。   #pragma , C++ Bjarne , :“#pragma , 。”    #ifdef, , if , , if , , 。    、    VC6 , , : /Yu, /Yc,/Yx,/Fp。 : MSDN -> Visual Studio 6.0 Document -> Visual C++ 6.0 Document -> VC++ Programmer Guider -> Compiler and Linker -> Details -> Creating Precompiled Header files    :    , ( .pch ), C/C++ , inline , , 。 , 。 。 , 6-7M 。 。    : Time stamp , , , , 。 ? , , , , (.eg Macro, Preprocessor ) 。VC 。 。    , , 。 。    , , , (.pch ) StdAfx.h 。 VC “ ” , 。 , 。 AppWizard MFC Dialog Based  。( AppWizard , StdAfx.h, VC )。 : #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls #include <afxcmn.h>    MFC , , 。    。 。 cpp .pch 。 StdAfx.cpp。 :#include “Stdafx.h”。 , ――― , .cpp 。 /Yc StdAfx.cpp .pch , /Fp pch 。 project ->Setting->C/C++ 。 Category Precompiled Header。 , : (Project ->Setting->C/C++ )    Project Options( ) /Fp “debug/PCH.pch”, .pch ,  < >.pch( PCH)。    , StdAfx.cpp, : (Project ->Setting->C/C++ ->StdAfx.cpp )    Project Option Source File Option( , , )。 /Yc ,/Yc Pch 。/Yc , YC 。VC StdAfx.cpp Obj PCH 。    , : (Project ->Setting->C/C++ -> )    ,Precomplier Use ……… , PCH stdafx.h 。 , ,( 1)/Yu "stdafx.h"。    , 。 , 。 :   1) /Yu, , .cpp , , pch .h ( stdafx.h) 。 , Unexpected file end. , , 。   2) pch , , pch 。 stdafx.cpp( /Yc cpp ) 。 Rebuild all。 cpp , Ctrl + F7 。

 
 
 
 
      



           ,   ,   。      .c  ,       ,



      ,   ,  ,              ,      c  。



       ,  :



fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\':



No such file or directory



  rebuild all   。



      ,    :



----------------  ------



      ,     ,              ,  



1。                  ,    preh.h



2。   preh.c,      :#include "preh.h"



3。  preh.c, project setting    creat precompiled headers,    



.c  ,  use precompiled header file



//



  



     ,     ,  precompiled header,            , 



precompiled header,     ,          ,         



---------     ----------



       :



                      ,            (   



 .pch     ),                             



C/C++  --------   inline   ,        ,           



     。         ,               。      



          。                ,   6-7M 。   



               。



     :        Time stamp   ,             , 



             ,              ,         



   。              ?     ,             



    ,         ,         ,             



       (.eg Macro, Preprocesser )        。VC       



          。                。



       :



      ,                    ,          



               。          。



       :



       ,           ,                



         ,                     (.pch  )



        StdAfx.h    。        VC     “    ” 



,          。     ,            。       



    AppWizard   MFC Dialog Based          。(  AppWizard



                 ,    StdAfx.h,  VC    )。  



                  :



#include <afxwin.h> // MFC core and standard components



#include <afxext.h> // MFC extensions



#include <afxdisp.h> // MFC Automation classes



#include <afxdtctl.h> // MFC support for Internet Explorer 4



Common Controls



#include <afxcmn.h>



      MFC         ,                     



  ,         。



                  。               。   



      cpp     .pch   。         StdAfx.cpp。     



         :#include “Stdafx.h”。        ,        



     ?D?D?D    ,      .cpp    。     /Yc      



 StdAfx.cpp     .pch  ,  /Fp          pch     。 



 project ->Setting->C/C++    。 Category  Precompiled Header。    



            



Project Options(          )     /Fp “debug/PCH.pch”,    



    .pch     ,       <   >.pch(         PCH)。



  ,           StdAfx.cpp.//       cpp  !



     Project Option    Source File Option(     ,       



,    )。          /Yc  ,/Yc                



Pch  。/Yc                    ,           



     YC  。VC         StdAfx.cpp     Obj     PCH  



。



                 ,//  cpp  



   ,Precomplier     Use ???  ,          PCH    stda



fx.h



  。   ,           ,(  1)/Yu”stdafx.h”。



  ,             。    ,             。 



      :



1):     /Yu,         ,     .cpp      ,     



    ,        pch   .h  (   stdafx.h)       。 



          ,    Unexpected file end.             ,



          ,         ?..



fatal error C1010: unexpected end of file while looking for precompiled



header directive



Generating Code...



2)    pch       ,                  。    



   ,           pch  。      stdafx.cpp(   /Yc   



cpp  )      。         Rebuild All。          cpp



  ,   Ctrl + F7    。           。



//



  ,              ,                 ! 
  CMD

   :

msconfig.exe            

mspaint           

mstsc                

devmgmt.msc         

notepad             

services.msc         

taskmgr              

explorer              

regedit.exe       

cmd.exe        cmd     

calc                 

compmgmt.msc         

inetmgr          inretnet     

control              

dxdiag           DirectX   

ipconfig       Internet      

inetcpl.cpl   Internet  

appwiz.cpl          

msinfo32.exe      

sysdm.cpl       

   

   :

diskmgmt.msc            

dfrg.msc               

secpol.msc            

sndvol32             

eventvwr            

perfmon.msc               

rononce -p     15   

osk                  

lusrmgr.msc          

Clipbrd               
C         

    C               ,            .           (preprocessor)    .              ,             " (macro)"    . 



C               ,        :    C        ,   ,   ,           .             .    C    ,                  ,                 .                   .   C                 .             .  gcc ,              CPP,          cpp. 



           C           .   :            C         ,                       C  ,          .

( )        

      #(hash  )  ,      , #        .  #            ,   #      C     .           :



#define                      

#undef                     



#include                  

#include_next    #include  ,          



#if                                 ,    C    if  

#ifdef                          ,     ,        

#ifndef              #ifdef  ,            

#elif                   #if, #ifdef, #ifndef    #elif     ,    #elif     ,    C    else-if

#else                 #if, #ifdef, #ifndef  ,         ,    #else     ,    C    else

#endif              #if, #ifdef, #ifndef           .

defined             #if, #elif    ,           



#line                          

#                                          

##                           (token)          

#pragma               



#warning               

#error                    

( )       

              ,               (token),         C  ,         .         C  ,    ,    ,       .

       :    #command name(...) token(s)

1, command        ,     #  , #         ,   C  #        ,                .        #(     ),      C         .                    ,        .

2, name     ,      .            (C99).

3,        "\"   .

e.g.

#  define  ONE 1 /* ONE == 1 */

   : #define ONE 1

#define err(flag, msg) if(flag) \

    printf(msg)

   : #define err(flag, msg) if(flag) printf(msg)



( )        



1, #define

#define       :

#define MACRO_NAME(args) tokens(opt)

     MACRO_NAME           (tokens).      ,            .



   

         "   (objectlike macro)"



#define        ,                .           .

e.g.

#define MAX 100

int a[MAX];



#ifndef __FILE_H__

#define __FILE_H__

#include "file.h"

#endif

#define __FILE_H__           ,          .           .



     ,            ,               .



   

         "   ".               :             ,                  CPU    .                                      .



            



             : #define name( args ) tokens

   args tokens     .                       .



  , name      (    name,        ,             ,         (      .         , name (       .



e.g.

#define mul(x,y) ((x)*(y))



  ,                ,       :

e.g.

#define mul(x,y) x*y

"mul(1, 2+2);"      : 1*2 + 2

  ,                :

e.g.

#define mul(x,y) (x)*(y)

sizeof mul(1,2.0)       sizeof 1 * 2.0



       ,                 ,             :

e.g.

mul (f(a,b), g(c,d));



e.g.

#define insert(stmt) stmt

insert ( a=1; b=2;)            a=1; b=2 .

insert ( a=1, b=2;)       :          :            .      ","         .  

insert ((a=1, b=2;))        .



           ,        :

1,      {}            ,               ";"  .

example_3.7:

#define swap(x,y) { unsigned long _temp=x; x=y; y=_tmp}

       : "swap(1,2);"      : { unsigned long _temp=1; 1=2; 2=_tmp}; 

     ;    ,         : swap(1,2)

           ,    C    ,             {}      :



#define swap(x,y) \

    do { unsigned long _temp=x; x=y; y=_tmp} while (0)

swap(1,2);      :

do { unsigned long _temp=1; 1=2; 2=_tmp} while (0);

 Linux         do-while(0)         .



2,          do-while(0)    ,           ";",             .

eg_3.8:

#define incr(v, low, high) \

    for ((v) = (low),; (v) <= (high); (v)++)

           : incr(a, 1, 10)  /* increase a form 1 to 10 */



                  

C99               .      ,                .



#define name(args, ...) tokens

#define name(...) tokens

"..."        ,           ,                .          ,                        (        ). 

  __VA_ARGS__              .   __VA_ARGS__              "..."   .



e.g.

#ifdef DEBUG

#define my_printf(...) fprintf(stderr, __VA_ARGS__)

#else

#define my_printf(...) printf(__VA_ARGS__)

#endif



tokens  __VA_ARGS__           "..."      . 



     #define         :

#define MAX = 100

#define MAX 100;

=, ;         .             ,      ";".



 

  :              ,                 .   ,               ?          ,   "##"   .

 

            

(1)         ,              .    "  "                 ,                ,                      :   tab,   ...

e.g.

#define NULL 0

#define NULL /* null pointer */     0

          ,          :

#define fun(x) x+1

#define fun(x) x + 1  : #define fun(y) y+1

       ,             , gcc   "NAME redefined"    .



           ,             C   ,               .  gcc ,         , gcc     .



(2)  gcc ,               :

e.g.

$ gcc -Wall -DMAX=100 -o tmp tmp.c

    tmp.c   " #define MAX 100".



  ,     tmp.c   MAX    ,     gcc       -DMAX,         ?

--- -DMAX=1,      .

--- -DMAX        1  ,   gcc   MAX        , MAX    1.



  :     gcc                ,   gcc       (1),  : -DVAL == -DVAL=1



(3) #define         

         ,      #undef  ,  #undef      .              

e.g.

#define ONE 1

sum = ONE + TWO    /* sum = 1 + TWO  */

#define TWO 2

sum = ONE + TWO    /* sum = 1 + 2    */  

#undef ONE

sum = ONE + TWO    /* sum = ONE + 2  */



char c[] = "TWO"   /* c[] = "TWO", NOT "2"! */



(4)           ,          .

e.g.

# define ONE NUMBER_1

# define NUMBER_1 1

int a = ONE  /* a = 1 */



2, #undef

#undef       ,   #define  :

#undef name

             #define   ,     #undef       .

          ,        . 



3, #if, #elif, #else, #endif

#if, #elif, #else, #endif      :



#if      1

      ...

#elif      2

      ...

#elif      3

      ...

...

#else

      ...

#endif



#if #else     C    if, else.                        . #elif   C  else-if.                           .

else         ,           , gcc        .



               ---                .            .

e.g.

#if 0

{

         ;

}

#endif



           ,     ,          C     ,                ,         0.

#if MACRO_NON_DEFINED  == #if 0

            ,       #if,               0.           #ifdef #ifndef.



  : #if, #elif, #else          .   name       ,         .    gcc   "-Wundef"              .



4, #ifdef, #ifndef, defined.

#ifdef, #ifndef, defined            

#ifdef name    #ifndef name



                :

#ifndef __FILE_H__

#define __FILE_H__

#include "file.h"

#endif



defined(name):      ,   1,     0.

  #if, #elif, #else             ,           ,       #ifdef #ifndef. defined                  :



#if defined(VAX) && defined(UNIX) && !defined(DEBUG) 



 #if, #elif, #else  , #indef, #ifndef, defined          ,        .  gcc   "-Wundef"               .



5, #include , #include_next

#include      .  #include                           .

#include "headfile"

#include <headfile>

#include      

            , "#include      " ,                ,                    .



   ,                #include       . #include"headfile"              ,  #include <headfile>    "     "        .         .                          .



  #include "headfile" #include <headfile>        gcc           ,    blog GCC  .



   #include,    #include_next    . #include_next        .         (#include        ,     .c   )         .               :                      .

  :            A,B,C,D,E. #include_next          B  ,   #include_next       C,D,E     #include_next       .



   cpp       #include_next



6,     

  C         ,        "__"     ,         .          #undef,        .



        C          (     gcc           :

__LINE__                      ,  10      .

__FILE__                      ,         .

__DATE__                    ,  "Mmm dd yyyy"        .

__TIME__                    ,  "hh:mm:ss"        ,     asctime  .



__STDC__                     ISO  ,        1

__STDC_VERSION__             C89,        199409L,     C99,       199901L. 

                      gcc,      -std=c99,        __STDC_VERSION__        ,     ?

__STDC_HOSTED__               "    (hosted)",        1.                  C .





gcc       :

__OPTMIZE__                        ,         1.

__OPTMIZE_SIZE__      ,                       1.

__VERSION__                gcc    .

   "GCC the complete reference".

    gcc          ,     : $ cpp -dM /dev/null



7, #line

#line    __LINE__ __FILE__. 

e.g.

  printf("line: %d, file: %s
", __LINE__, __FILE__); #line 100 "haha" printf("line: %d, file: %s
", __LINE__, __FILE__); printf("line: %d, file: %s
", __LINE__, __FILE__); : line: 34, file: 1.c line: 100, file: haha line: 101, file: haha 8, #pragma, _Pragma #pragma . #pragma , gcc : #pragma GCC name token(s) #pragma : GCC pragma name. gcc . (1) #pragma GCC dependency dependency ( ) ( #pragma ) . , . e.g. demo.c : #pragma GCC dependency "temp-file" demo.c : $ touch temp-file, : $ gcc demo.c : warning: current file is older than temp-file , . #pragma . e.g. #pragma GCC dependency "temp-file" "demo.c needs to be updated!" 1.c:27:38: warning: extra tokens at end of #pragma directive 1.c:27:38: warning: current file is older than temp-file : "" , gcc . (2) #pragma GCC poison token(s) #pragma token(s), . . e.g. #pragma GCC poison scanf scanf("%d", &a); warning: extra tokens at end of #pragma directive error: attempt to use poisoned "scanf" , poison , . , , "" token(s) . (3) #pragma GCC system_header #pragma GCC system_header . C , . ( #warning ). ( #pragma ) #pragma , gcc _Pragma: e.g. #define PRAGMA_DEP #pragma GCC dependency "temp-file" , , #pragma , _Pragma : #define PRAGMA_DEP _Pragma("GCC dependency \"temp-file\"") , () "" \ . 9, #, ## # ## , printf, puts . # tokens tokens . e.g. #define TEST(a,b) printf( #a "<" #b "=%d
", (a)<(b)); : # token ! ## token token . ## token. e.g. #define TYPE(type, n) type n : TYPE(int, a) = 1; TYPE(long, b) = 1999; : int a = 1; long b = 1999; (10) #warning, #error #warning, #error , : #warning tokens #error tokens e.g. #warning "some warning" , #error #warning token "" ! ( gcc , warning, , error, . -Werror, , .
  

 

 .        ... 3

1.1.      ... 3

1.2        ... 3

 .     ... 4

2.1.     ... 4

2.2.    ... 4----#define. 4

3.1.     ... 4

3.2     ... 5

3.3.      # ##. 6

3.3.1.   #. 6

3.3.2.   ##. 6------include. 6

 .    ... 7

5.1  #if 7

5.2  #ifdef #ifndef 9

5.3  #defined #undef 10

 .       ... 11

6.1.      ... 11

6.2.          ------------#line. 11

6.3.          ------------#pragma. 12

6.4.         ------------#error 12

 .    ... 13

 

 

 

                            ,              ,                              。                。

 C              #       ,           。       C     ,   C       。          C         。

 .        

 

1.1.      

 

            ,  ,        。  ,C              ,         :   。          :

●      ”include”                 。

●       “#define”      。

●  “#if”              。

 



1.2        

 

             。      #         。

#define        ---             ,           。                        #define  。               ,    ”  ”  ,           。

#include                 ,                  “  ”  。  :      :

#include<stdio.h>

             stdio.h   ,              。

          C    ,        。           ,             。              :            ,      。               ,            ,           。

 



 .     

 

 2.1.     

 

             3   :

●   :#define        ,#undef         。

●    :#include                    。

●    :#if,#ifdef,#ifndef,#elif,#else #dendif                                    。

   #error,#line #pragma        ,    。

 



2.2.    

 

●     #  。#           ,            。 #     ,             。

●                         。

●             ,          。

●               。     #define #include         ,         ,          。

●            。

 



 .     ----#define   

      

  #define              ,            。           “  ”。         ,         “  ”,             ,   “   ” “   ”。

 C   ,            。

 



3.1.     

           :

#define        

         ,        :

● #:           (   “#”          )。

●define:   “define”      。

●  :      ,    C        ,           。

●   :     ,   ,    。                       。

Notice:

                 ,   #define     ,                 。                 。

Eg:#define PI 3.14

       ,         :

●              ,               。          ,           ,     ,       ,             。    ,                  。

●           ,                 。

●                ,             。

●       ,                    。               。

●             ,        。         。

 



3.2     

 

#define      ,         。         ,             ,              。      ,    ,      ,          。

           :

#define   (   )     

         ,               ,  ,            ,       。

Eg:#define ABS(x) (x)<0?-(x):(x)

        ,  x    0,        (-)    ,    。

            ,        。      ,                   ,            ,        ,           。              ,     ,     ,       ,            。

 



3.3.      # ##

 

3.3.1.   #

 

      #define    ,      #         。Eg:

#define AREA(x,y) printf(“  “#x”,  “#y”       :%d
”,(x)*(y)); 3.3.2. ## # , ## 。 。 , : #define VAR(n) v##n : VAR(1) , : V1 : #define FUNC(n) oper##n 1 , : oper1 . ------include C , main 。 main , , , 。 , 。 , 。 , , : #include< > #include“ ” <> , C include 。 C include , ; , 。 , #include 。 #include #include , , #include 。 # , , 。 #include , “.c”, C 。 “.h”, C 。C 。 #define , 。 C , 8 。 . 。 , , 。 , , 。 5.1 #if C , , , 。 #if#if #else #endif : ( 0), 1 , 2 。 。 Eg: #define DEBUG 1 int main() { int i,j; char ch[26]; for(i='a';j=0;i<='z';i++,j++) { ch[j]=i; #if DEBUG printf("ch[%d]=%c
",j,ch[j]); #endif } for(j=0;j<26;j++) { printf("%c",ch[j]); } return 0; } #if , : #if 1 1 #elif 2 2 … … #elif n n #else m #endif #elif if else if 。 Eg: #define os win #if os=win #include"win.h" #elif os=linux #include"linux.h" #elif os=mac #include"mac.h" #endif #if #elif ,C89 , 8 , C99 63 。 , #endif,#else #elif #if #elif 。 Eg: #define MAX 100 #define OLD -1 int main() { int i; #if MAX>50 { #if OLD>3 { i=1; { #elif OLD>0 { i=2; } #else { i=3; } #endif } #else { #if OLD>3 { i=4; } #elif OLD>4 { i=5; } #else { i=6; } #endif } #endif return 0; } 5.2 #ifdef #ifndef #if , 。 , , 。 , #if , ———#ifdef. #ifdef : #ifdef 1 #else 2 #endif , #ifdef , “ 1” ; , “ 2”。 #else “ 2”。 #ifndef #ifdef , : #ifndef 1 #else 2 #endif : , “ 1”; “ 2”。 5.3 #defined #undef #ifdef , #if define 。 : #if defined 1 #endif 。 #ifdef 1 #endif , defined 。 : #if ! define 1 #endif 。 #ifndef 1 #endif #ifdef #ifndef #define 。 , #undef , : #undef Eg: #define MAX 100 …… #undef MAX , #define MAX, , #undef 。 #undef , #ifdef max, , MAX 。 . 6.1. ANSI C , , ( )。 5 : ● __DATE__: 。 ● __FILE__: ( )。 ● __LINE__: 。 ● __STDC__: C, 1 C, C. ● __TIME__: 。 Eg: #include<stdio.h> int main() { int j; printf(" :%s
",__DATE__); printf(" :%s
",__TIME__}; printf(" :%s
",__FILE__); printf(" %d
",__LINE__); printf(" %s C
",(__STD__)?" ":" "); return 0; } 6.2. ------------#line __LINE__ 。 #line __LINE__ __FILE__ , : #line number[“filename”] , 。 , 。 #line 。 Eg: 1:#include<stdio.h> 2:#include<stdlib.h> 4#line 1000 6int main() 7:{ 8: printf(" :%d
",__LINE__); 9return 0; 10:} , 4 #line 1000 ( #line )。 5 1000, 6 1001, 7 1002, 8 1003. 6.3. ------------#pragma #pragma , 。#pragma , C , 。 : #pragma Para ,Para , , : Message , , , : #pragma message( ) , 。 pragma code_seg. : #pragma code_seg([“section_name”[,section_class]]) , 。 once, , : #pragma once6.4. ------------#error #error , , 。 : #error , 。 #error , 。 , __STDC__, 1, , ANSI C 。 #if __STDC__!=1 #error NOT ANSI C #endif . #define , , , , , 。 , , 。 , , 。 C99 , : 。 , 。 , 。 , , , , 。 , inline 。 。 , : #include<stdio.h> #include<stdlib.h> inline int add(int x,int y); inline int add(int x,int y) { return x+y; } int main() { int i,j,k; printf("
"); scanf("%d %d",&i,&j); k=add(i,j); printf("k=%d
",k); return 0; } , add , , 。 , 。 , , ; , 。 , : ● 。 ● 。 , , , , , , , 。 。
C                ,           。         C      ,     C       。                         ,         。ANSI     C             :

#define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma 。    ,           #  ,        。

  #define

  #define            。              ,         。ANSI           ,          。        :

#define identifier string

  :

1       。                ,     ,       。

2     ,               。

3                 ,                ,       。  :

#define XYZ this is a tes

   printf("XYZ");//     "this is a test"   "XYZ"。           "XYZ"

4       ,            ' \'  。

#defineLONG_STRING"this is a very long\

string that is used as an example"

5 C                 。

6                             ,            。         :              。

 

  #error

  #error          ,        。

#error               ,           .                         。

  #include

  #i nclude               #include    ,                    。  :

#include"stdio.h"  #include<stdio.h>

        C                      。

     #i nclude           ,             ,           。

                 ,                。  ,            ,           。       ,                。        ,             。

                    ,                。       ,       ,         。

        

                        ,         。                               。

#if、#else,#elif #endif

#if        #if         true,     #endif     ,        。  #endif    #if    。

#if constant-expression

statement sequence

#endif

Eg:

#define MAX 91

#include <iostream>

using namespace std;

int main()

{

#if MAX > 99

       cout<<"MAX is bigger than 99"<<endl;

#elif MAX > 90

       cout<<"MAX is bigger than 90"<<endl;

#else

       cout<<"MAX is smaller than 90"<<endl;

#endif

       return 0;

}

  #if            ,                  ,      。          sizeof(sizeof       )。

 

#else        C    else;#else      ( #if      )。  ,#else  #if 。

 

#elif     ELSE IF   ,     if else-if     ,         。#elif          。      true,         ,    #elif       。  ,       。

 

#if expression

statement sequence

#elif expression1

statement sequence

#endif

 

         #endif、#else #elif   #if #elif  。

# ifdef  # ifndef

 

            #ifdef #ifndef  ,      "     " "     "。# ifdef      :

 

# ifdef macroname

statement sequence

#endif

 

#ifdef #ifndef    #if、#else,#elif   ,      #endif。

 

#define MAX 91

#include <iostream>

using namespace std;

 

int main()

{

#ifdef MAX

       cout<<"hello,MAX!"<<endl;

#else

       cout<<"where is MAX?"<<endl;

#endif

#ifndef LEO

       cout<<"LEO is not defined"<<endl;

#endif

       return 0;

}

  #undef                  。     :

#undef macroname

  #line  __LINE__ __FILE__   ,                 。         :

#line number["filename"]

           ,                。           ,          。  #line             。  : #line                  。

#line 100 "jia"

       cout<<"#line change line and filename!"<<endl; //line 100

       cout<<__LINE__<<endl; //101

       cout<<__FILE__<<endl; //jia

  #pragma

  #pragma          ,              。

#pragma                             。#pragma               ,    C C++          ,              。    ,               ,             。

      : #Pragma Para

1 message   。

 Message                      ,                 。      :

#pragma message(“    ”)

                             。

                        ,                      ,                      。                         _X86           

#ifdef _X86

#pragma message(“_X86 macro activated!”)

#endif

      _X86     ,                    “_

X86 macro activated!”。                           。



2  code_seg   。

   :

#pragma code_seg( ["section-name"[,"section-class"] ] )

                  ,                  。



3 #pragma once (    )

                             。        VC6      ,                 。



4 #pragma hdrstop

            ,            。BCB                ,                        ,               。

           ,    A    B,    B     A  。    #pragma startup       ,     #pragma package(smart_init) ,BCB              。



5 #pragma resource "*.dfm"

   *.dfm          。*.dfm          。



6 #pragma warning( disable : 4507 34; once : 4385; error : 164 )#pragma warning(disable:4507 34) /*    4507 34     。         4507    34   ,            ,        。*/

#pragma warning(once:4385) // 4385          

#pragma warning(error:164) //  164           。

    pragma warning        :

#pragma warning( push [ ,n ] )

#pragma warning( pop )

  n        (1---4)。

#pragma warning( push )                。

#pragma warning( push, n)                ,            n。

#pragma warning( pop )             ,                 。  :

#pragma warning( push )

#pragma warning( disable : 4705 )

#pragma warning( disable : 4706 )

#pragma warning( disable : 4707 )

//.......

#pragma warning( pop )

        ,           (  4705,4706 4707)。



7 pragma comment(...)

                         。

   lib   ,            。 



8 progma pack(n)

         。#pragma pack(n)      n      。

n                          :

  、  n              ,                ,

  、  n               ,      n   ,           。

             ,       :  n                 ,                             ;      n   。

         。

#pragma pack(push) //      

#pragma pack(4)//   4    

struct test

{

char m1;

double m4;

int m3;

};

#pragma pack(pop)//      

      ,    sizeof()        !



: #pragma Para。

Messageパラメータ
 
   
Message 参数能够在编译信息输出窗口中输出相应的信息,这对于 ソースコード信息的控制是非常重要的。其使用方法为:
 
   
1
#pragmamessage(“ ”)
 
   
コンパイラ遇到这条指令时就在编译输出窗口中将消息文本打印出来。
 
   
当我们在程序中定义了许多宏来控制 ソースコード版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在 コンパイル的时候就进行检查。假设我们希望判断自己有没有在 ソースコード的什么地方定义了_X86这个宏可以用下面的方法
 
   
1
2
3
#ifdef_X86
#pragmamessage("_X86macroactivated!")
#endif
 
   
当我们定义了_X86这个宏以后, アプリケーション在编译时就会在编译输出窗口里显示“_X86 macro activated! ”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。
 
   

code_seg

 
   
另一个使用得比较多的pragma参数是code_seg。格式如:
 
   
1
#pragmacode_seg(["section-name"[,"section-class"]])
 
   
它能够设置程序中函数代码存放的 コードセグメント,当我们开发 ドライバ的时候就会使用到它。
 
   

#pragma once

 
   
(比较常用)
 
   
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
 
   
#pragma once是编译相关,就是说这个 コンパイルシステム上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个 コンパイラ都有这个定义了。
 
   
#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的 マクロ定義,通过宏定义避免文件多次编译。所以在所有支持C++语言的 コンパイラ上都是有效的,如果写的程序要跨平台,最好使用这种方式
 
   

#pragma hdrstop

 
   
#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以 プリコンパイル头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
 
   
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。
 
   

#pragma resource

 
   
#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括 ツールバーの外观的定义。
 
   

#pragma warning

 
   
1
#pragmawarning(disable:450734;once:4385;error:164)
 
   
等价于:
 
   
1
2
3
#pragmawarning(disable:450734)// 4507 34
#pragmawarning(once:4385)//4385
#pragmawarning(error:164)// 164 。
 
   
同时这个pragma warning 也支持如下格式:
 
   
1
2
#pragmawarning(push[,n])
#pragmawarning(pop)
 
   
这里n代表一个警告等级(1---4)。
 
   
1
2
3
#pragmawarning(push) 。
#pragmawarning(push,n) , n。
#pragmawarning(pop) ,
 
   
在入栈和 宿屋を出る之间所作的一切改动取消。例如:
 
   
1
2
3
4
5
6
#pragmawarning(push)
#pragmawarning(disable:4705)
#pragmawarning(disable:4706)
#pragmawarning(disable:4707)
//.......
#pragmawarning(pop)
 
   
在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。
 
   

pragma comment

 
   
1
pragmacomment(...)
 
   
该指令将一个注释记录放入一个对象文件或 実行可能ファイル中。
 
   
常用的lib关键字,可以帮我们连入一个 ライブラリファイル
 
   
每个 コンパイラ可以用#pragma指令激活或终止该编译程序支持的一些编译功能。例如,对循环优化功能:
 
   
1
2
#pragmaloop_opt(on)//
#pragmaloop_opt(off)//
 
   
有时,程序中会有些函数会使 コンパイラ发出你熟知而想忽略的警告,如“Parameter xxx is never used in function xxx”,可以这样:
 
   
1
2
3
4
#pragmawarn—100//Turnoffthewarningmessageforwarning#100
intinsert_record(REC*r)
{ /*functionbody*/ }
#pragmawarn+100//Turnthewarningmessageforwarning#100backon
 
   
函数会产生一条有唯一特征码100的警告信息,如此可暂时终止该警告。
 
   
每个 コンパイラ对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从 コンパイラ的文档中查看。
 
   
1
2
3
4
5
6
#pragmapack(n) #pragmapop()
structsample
{
chara;
doubleb;
};
 
   
当sample结构没有加#pragma pack(n)的时候,sample按最大的成员那个对齐;
 
   
(所谓的对齐是指对齐数为n时,对每个成员进行对齐,既如果成员a的大小小于n则将a扩大到n个大小;
 
   
如果a的大小大于n则使用a的大小;)所以上面那个结构的大小为16字节.
 
   
当sample结构加#pragma pack(1)的时候,sizeof(sample)=9字节;无空字节。
 
   
(另注:当n大于sample结构的最大成员的大小时,n取最大成员的大小。
 
   
所以当n越大时,结构的速度越快,大小越大;反之则)
 
   
#pragma pop()就是取消#pragma pack(n)的意思了,也就是说接下来的结构不用#pragma pack(n)
 
   
1
#pragmacomment(comment-type,["commentstring"])
 
   
comment-type是一个预定义的 識別子,指定注释的类型,应该是compiler,exestr,lib,linker之一。
comment string是一个提供为comment-type提供附加信息的字符串。
注释类型:
1、compiler:
放置 コンパイラ的版本或者名字到一个对象文件,该选项是被linker忽略的。
2、exestr:
 
   
在以后的版本将被取消。
 
   
3、lib:
 
   
放置一个库搜索记录到对象文件中,这个类型应该是和comment string(指定你要Linker搜索的lib的名称和路径)这个库的名字放在Object文件的默认库搜索记录的后面,linker搜索这个这个库就像你在命令行输入这个命令一样。你可以在一个 ソースファイル中设置多个库记录,它们在object文件中的顺序和在源文件中的顺序一样。如果默认库和附加库的次序是需要区别的,使用Z编译开关是防止默认库放到object模块。
 
   
4、linker:
 
   
指定一个连接选项,这样就不用在命令行输入或者在 開発環境中设置了。
 
   
只有下面的linker选项能被传给Linker.
 
   
1
/DEFAULTLIB,/EXPORT,/INCLUDE,/MANIFESTDEPENDENCY,/MERGE,/SECTION
 
   
(1) /DEFAULTLIB:library
 
   
/DEFAULTLIB 选项将一个 library 添加到 LINK 在解析引用时搜索的库列表。用 /DEFAULTLIB指定的库在命令行上指定的库之后和 .obj 文件中指定的默认库之前被搜索。忽略所有默认库 (/NODEFAULTLIB) 选项重写 /DEFAULTLIB:library。如果在两者中指定了相同的 library 名称,忽略库 (/NODEFAULTLIB: library) 选项将重写 /DEFAULTLIB: library
 
   
(2)/EXPORT: entryname[,@ ordinal[,NONAME]][,DATA]
 
   
使用该选项,可以从程序导出函数,以便其他程序可以调用该函数。也可以导出数据。通常在 DLL 中定义导出。 entryname是调用程序要使用的函数或 データこうもく的名称。ordinal 在导出表中指定范围在 1 至 65,535 的索引;如果没有指定 ordinal,则 LINK 将分配一个。 NONAME关键字只将函数导出为序号,没有  entryname
 
   
DATA 关键字指定导出项为 データこうもく。客户程序中的 データこうもく必须用  extern __declspec(dllimport)来声明。
 
   
有三种导出定义的方法,按照建议的使用顺序依次为:
 
   
ソースコード中的 __declspec(dllexport).def 文件中的 EXPORTS 语句LINK 命令中的 /EXPORT 规范所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建 ライブラリのインポート,除非生成中使用了 .exp 文件。
 
   
LINK 使用 識別子的修饰形式。 コンパイラ在创建 .obj 文件时修饰 識別子。如果  entryname以其未修饰的形式指定给 リンク(与其在 ソースコード中一样),则 LINK 将试图匹配该名称。如果无法找到唯一的匹配名称,则 LINK 发出 エラーメッセージ。当需要将 識別子指定给 リンク时,请使用 Dumpbin 工具获取该标识符的修饰名形式。
 
   
(3)/INCLUDE:symbol
 
   
/INCLUDE 选项通知 リンク将指定的符号添加到 シンボルテーブル
 
   
若要指定多个符号,请在符号名称之间键入逗号 (,)、分号 (;) 或空格。在命令行上,对每个符号指定一次 /INCLUDE:symbol。
 
   
リンク通过将包含符号定义的对象添加到程序来解析 symbol。该功能对于添包含不会链接到程序的库对象非常有用。用该选项指定符号将通过 /OPT:REF 重写该符号的移除。
 
   
我们经常用到的是#pragma comment(lib,"*.lib")这类的。#pragma comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库。 和在工程设置里写上链入Ws2_32.lib的效果一样,不过这种方法写的 程序别人在使用你的代码的时候就不用再设置工程settings了
 
   

#pragma disable

 
   

  在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。一般在C51中使用较多。
 
   

#pragma data_seg

 
   
介绍[1]  
 
   
用#pragma data_seg建立一个新的 データセグメント并定义共享数据,其具体格式为:
 
   
1
2
3
#pragmadata_seg("shareddata")
HWNDsharedwnd=NULL; //
#pragmadata_seg()
 
   
-----------------------------------------------------------------
 
   
1,#pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的有名字的 データセグメント。最关键的是:这个 データセグメント中的 グローバル変数可以被多个进程共享,否则多个进程之间无法共享DLL中的全局变量。
 
   
2,共享数据必须初始化,否则微软 コンパイラ会把没有初始化的数据放到. BSSセグメント中,从而导致多个进程之间的共享行为失败。例如,
 
   
1
2
3
4
5
6
7
8
9
10
11
12
#pragmadata_seg("MyData")
intg_Value; //Notethattheglobalisnotinitialized.
#pragmadata_seg()
//DLL :
intGetValue()
{
returng_Value;
}
voidSetValue(intn)
{
g_Value=n;
}
 
   
然后启动两个进程A和B,A和B都调用了这个DLL,假如A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值不一定是5,而是一个未定义的值。因为DLL中的全局数据对于每一个调用它的进程而言,是私有的,不能共享的。假如你对g_Value进行了初始化,那么g_Value就一定会被放进MyData段中。换句话说,如果A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值就一定是5,这就实现了跨进程之间的数据通信。



適用例(#pragma pack)
 
   
ネットワークプロトコル编程中,经常会处理不同协议的数据报文。一种方法是通过 ししん偏移的方法来得到各种信息,但这样做不仅 プログラミング复杂,而且一旦协议有变化,程序修改起来也比较麻烦。在了解了 コンパイラ对结构空间的分配原则之后,我们完全可以利用这一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。
其协议结构定义如下:
 
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragmapack(1)// 1
structTCPHEADER
{
shortSrcPort; //16
shortDstPort; //16
intSerialNo; //32
intAckNo; //32
unsignedcharHaderLen:4; //4
unsignedcharReserved1:4; // 16 4
unsignedcharReserved2:2; // 16 2
unsignedcharURG:1;
unsignedcharACK:1;
unsignedcharPSH:1;
unsignedcharRST:1;
unsignedcharSYN:1;
unsignedcharFIN:1;
shortWindowSize; //16
shortTcpChkSum; //16 TCP
shortUrgentPointer; //16
};
#pragmapop()// 1
 
   
#pragma pack规定的对齐长度,实际使用的规则是: 结构,联合,或者类的 データ・メンバー#データメンバー#,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。 但是,当#pragma pack的值等于或超过最长 データ・メンバー#データメンバー#的长度的时候,这个值的大小将不产生任何效果。 而结构整体的对齐,则按照 こうぞうたい中最大的 データ・メンバー#データメンバー#进行。
 
C       

C         ANSIC     ,    C         ,           ,            。            (         ,    ,   )  ,              “   ”,  :      #include        “stdio.h”,      , stdio.h             。                          ,                ,           。              ,       ,          。              C      ,                 。

C             :   ,    ,    。       “#”  。

  ,     :                 ,       :

#define        

#define PI 3.1415926

        “  ”,                   “   ”, #define      。

         :

1,            ,         ,       ,        1      l,           ,             。

2,      C  ,        ,               。

3, #define             ,                     ,  #define        ,    ,        ,         。

4,    #undef           。 :

#define PI 3.1415926

main(){

}

#undef PI

mysub(){ }

  mysub PI    3.14159265,        ,          ,      。

6,                    ,       ,      。

7,                     ,           ,            。

       ,            ,       。        :#define   (   )   #define S(a,b) a*b,        int area; area=(2,3);

                :            ( area=(2,3)),  #define                  。           ( a,b),            (     ,  ,    )    。                    (  *),   ,            。

               ,                    ,             ,            ,   :

1,      ,          ,      ,                  。

2,               ,            。             ,            ,         ,         。

3,                 ,         ,    ,       ;         ,     ,        ,        ,             。    ,             。

4,              ,             。

5,        ,        ,             ,         。

6,          ,      ,           (    ,    ,   ,  )。

  ,     :                       ,              。

#include <   >   #include“   ”

    JAVA   ,       J2EE      *.xml     ,            ,          ,   (  )        (              )        ,           。

 #include   ,      “” <>   ,       <> ,                     ,    ,         (          )。    ,           #include           ,  <>,       。                (             ),   “”,          ,“”        。

 ,    

     ,             。                          ,                ,       。

1,#indef    

   1

#else

   2

#endif

           #include     ,             1,       2。

2#if    

   1

#else

   2

#endif

  :      ,          ,           ,      ,          ,          。