,#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
6:int main()
7:{
8: printf(" :%d
",__LINE__);
9: return 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 once
。
6.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 参数能够在编译信息输出窗口中输出相应的信息,这对于
ソースコード信息的控制是非常重要的。其使用方法为:
当
コンパイラ遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制
ソースコード版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在
コンパイル的时候就进行检查。假设我们希望判断自己有没有在
ソースコード的什么地方定义了_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
每个
コンパイラ可以用#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: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
|
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.1415926。
5, , , 。
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
: , , , , , 。