2013-10-20 2 views
3

소스 코드에서 헤더가 포함되어 있는지 알 수 있습니까? 헤더가 포함되어 있는지 알 수 있습니까?

이 내가 필요로하는 내용의 예

는 : 나는 "iostream"를 입력하면

#include<iostream> 
using namespace std; 

int main() 
{ 
    char headname[4]; 
    cout<<"Enter a header name : "; 
    cin>>headname; 

    #ifdef headname 
     cout<<headname<<" Defined"<<endl; 
    #else 
     cout<<headname<<" Not defined"<<endl; 
    #endif 

    return 0; 
} 

예를 들어, 출력은 "정의 iostream"이어야합니다.

+4

컴파일 전에'# ifdef'가 실행됩니다. 런타임 중에는 확실히 실행되지 않습니다. – chris

+0

문제의 해결 방법 !! 내가 원하는 것은 가능하다 !! – BBeta

+4

예, 헤더가 포함되어 있는지 알 수 있습니다. 소스 파일의 맨 위를보십시오. –

답변

3

예. 그래서 당신은 _GLIBCXX_IOSTREAM를 확인할 수

#ifndef _GLIBCXX_IOSTREAM 
#define _GLIBCXX_IOSTREAM 1 

: 내가 보는 iostream 헤더를보고 내 젠투 리눅스/GCC 시스템에서

#ifndef MY_HEADER_INCLUDED 
#define MY_HEADER_INCLUDED 

// [...] 

#endif 

: 헤더는 일반적으로 사용하는 등의 경비를 포함한다. GCC를 사용하지 않는 경우 iostream 헤더 파일을 열고 정의 된 매크로를 확인하십시오.

또한 헤더에 속하므로 헤더에 속하므로 _GLIBCXX_IOSTREAM (내 경우에는) 정의되지 않은 경우 코드도 컴파일되지 않습니다. 그러나 printf()을 테스트에 사용할 수 있습니다.

+3

그러나 이렇게하면 런타임이 아닌 컴파일 시간 검사 (#ifdef)가 발생합니다. –

+0

'# ifdef'는 전처리 지시자입니다. 런타임 중에는 사용하지 않습니다. – Kunal

+1

네, 런타임시'char []'를 확인해 주셔서 행운이 ... –

2

물론 그것은 가능 :

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 

int main(void) { 
    std::vector<std::string> includes; 
    includes.push_back("iostream"); 
    includes.push_back("vector"); 
    includes.push_back("string"); 
    includes.push_back("algorithm"); 

    std::string user_input; 
    std::cout << "Enter a header name: "; 
    std::cin >> user_input; 

    if (std::find(includes.begin(), includes.end(), user_input) != 
      includes.end()) { 
     std::cout << user_input << " is included." << std::endl; 
    } else { 
     std::cout << user_input << " is not included." << std::endl; 
    } 

    return 0; 
} 

출력 :

[email protected]:~/src/cpp/scratch$ ./incl 
Enter a header name: iostream 
iostream is included. 
[email protected]:~/src/cpp/scratch$ ./incl 
Enter a header name: map 
map is not included. 
[email protected]:~/src/cpp/scratch$ 
+0

음 ...이게 전부 무엇입니까? OP가 물어 보지 않은 것이 무엇입니까 – P0W

+1

OP가 요청한 것과 정확히 똑같은 일을합니다. 프로그램의 사용자는 런타임에 소스에 포함 된 헤더를 확인할 수 있습니다. –

+2

OP는 어떻게 든이 프로세스를 자동화 할 수 있다고 착각하고 있습니다. 어느 쪽이 아닌가. – EboMike

0

가 먼저 전원이, #include 이후 다른 어떤에서 실행되는 "컴파일 타임에"A "런타임"헤더 및 확인된다 #ifdef과 함께 컴파일 시간. #include은 기본적으로 .cpp 파일의 맨 위에 머리글의 복사 붙여 넣기를 수행합니다. Razvan Cojocaru는 _GLIBCXX_IOSTREAM 날씨를 확인하기 위해 #ifdef을 사용할 수 있다고 지적했습니다.

class Flagger 
{ 
    typedef unsigned long ulong; 
    public: 
     Flagger (ulong flags = 0) : f(flags) { ; } 
     Flagger (const Flagger& cpy) : f(cpy.f) { ; } 

     void clear (ulong flags) { f &= ~flags; } 
     void set (ulong flags) { f |= flags; } 
     void toggle (ulong flags) { f ^= flags; } 

     bool get (ulong flags) { return f & flags; } 

#ifdef _GLIBCXX_OSTREAM 
     friend std::ostream& operator << (std::ostream &out, const Flagger& f) 
       { /* print it how you want it*/ } 
#endif 

    private: 
     ulong f; 
}; 
그러나

, 이 아마 여러 가지 이유로 나쁜 생각입니다 :

  1. 가 사용자를 포함한 후 위의 헤더를 포함 할 필요가 여기에이 사용할 수있는 곳의 작은 예입니다 iostream 또는 컴파일러가 함수를 삭제합니다.
  2. iostream 라이브러리의 제작자가 #define 이름을 변경하기로 결정하면 해당 기능이 삭제됩니다. 마찬가지로 누군가 다른 iostream 버전과 다른 #define 태그를 사용하면 함수가 삭제됩니다.
  3. 위의 예에서 직접 라이브러리를 포함하는 것은 너무 다릅니다. 무작위 사용자가 라이브러리를 사용하지 않으면 프로그램의 최종 크기가 크게 다르지 않으며 기능이 전혀 변경되지 않습니다.

그래서 기본적으로, 그래 그것은 하지만 하지 실용적입니다. 특히 장기간 유지 관리가 필요합니다. 이점은 위험보다 중요하지 않습니다. 라이브러리에 직접 질문을 포함 시키십시오.

여기에있는 다른 사람들의 말처럼 우리가 최종 결과가 무엇인지 알면 도움이 될 것입니다. 당신이 이것을 가장 많이 사용하려고 계획하고있는 곳은 더 나은 해결책을 가지고있을 것입니다.

-1

예,이 작업을 수행하는 빠른 해킹은 다음과 같습니다

소스 코드 헤더 파일로 이동하기 만하면됩니다.

지금 cout<<ACCESSED_MEMBER

컴파일하고 그 다음 콘솔에 축하를 인쇄있어 경우, 프로그램을 실행, 파일이 성공적으로 포함되어 있습니다 - 그리고 모든 구성원을 통해 (헤더 파일의 소스 코드를 어디서나 정의 된 상수)에 액세스 당신의 코드.

참고 : 1 헤더의 특정 소스 파일을 찾으려면. 터미널에

locate <header_file_name> 을 입력하면 파일 위치를 알 수 있습니다. vi 또는 nano 또는 gedit 또는 원하는 편집기에서 열어서 멤버를 확인하십시오.

참고 : 2 참고 :이 헤더 파일을 소유하지 않은 경우이 헤더 파일을 변경하지 마십시오.

관련 문제