2017-01-30 3 views
-1

나는 소스를 openssl에서 읽고 있는데, 다음 라인들은 아직 정의되지 않았다면 분명히 SSL_OP_NO_SSLv3을 정의한다. 전에는 그런 마법을 보지 못했습니다. 누구든지 여기에 구문을 가르쳐 줄 수 있습니까?C에서 정의를 추가하는 방법을 이해하는 방법?

#if !defined(OPENSSL_NO_SSL3) 
    | SSL_OP_NO_SSLv3 
#endif 

당신은 전체 파일에 대한 this link을 참조하고 라인 327

+1

참조 라인 (325)이'#의 if' 그냥 거기에 선언 된'mask' 변수에 플래그를 추가합니다. –

+1

_ 다음 줄은 분명히 ... _No! 이 선은 아무 것도 정의하지 않습니다. – Gerhardh

+0

모두에게 감사드립니다. 어리석은 질문 때문에 -1이 되었습니까? –

답변

2

문제는 단지 주변의 코드 (약간 여기 간체)로 의미가 있습니다 :

mask = SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1 
#if !defined(OPENSSL_NO_SSL3) 
        |SSL_OP_NO_SSLv3 
#endif 
    ; 

전처리 그냥 텍스트 대체를 수행합니다. OPENSSL_NO_SSL3이 정의되지 않은 매크로 전처리, 전처리 된 코드는 다음과 같이 표시됩니다 그래서 경우 :

mask = SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1 
        |SSL_OP_NO_SSLv3 
    ; 

그렇지 않으면이 같은 전처리 코드 병 모양 :

mask = SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1 
    ; 
1

이 매크로를 정의하지 않습니다 볼 수 있습니다. 비트 마스크에 표현식을 추가합니다. 그 작업은 bitwise 또는. 유효한 코드가 되려면 매크로/열거 형 SSL_OP_NO_SSLv3이 있어야합니다.

매크로 OPENSSL_NO_SSL3이 정의 된 경우이면 조건부 내부의 코드는 원본에 포함되지 않습니다.

조건부 컴파일을 구현하는 일반적인 방법은 매크로 정의에 대한 전 처리기 검사를하는 것입니다. 이 방법으로 동일한 소스를 다양한 구성으로 컴파일 할 수 있습니다. 검사 할 매크로는 소스에서 #define으로 정의하거나, 빌드 시스템을 통과 (gcc -D 옵션과 같이)하거나 전처리기에 내장 할 수 있습니다 (예 : __STDC_IEC_559__).

관련 문제