programing

일부 매크로의 출처를 찾는 방법

css3 2023. 10. 22. 20:19

일부 매크로의 출처를 찾는 방법

매크로를 정의하는 데는 여러 곳이 있습니다.매크로를 우리가 자체 프로젝트에서 정의할 때, 매크로는 이들에 대한 정의 위치를 쉽게 찾을 수 있습니다.그러나 유명한 오픈 소스 프로젝트를 배우려고 할 때 매크로의 출처를 어디서 찾을 수 있는지, 매크로의 정의를 얻을 수 없다면 매크로의 일부를 이해할 수 없을 것입니다(예: 매크로의 일부는 이름으로 추측할 수 있습니다).예를 들어 apache의 일부 문:

#if defined(__osf__) && defined(__alpha),

#elif defined(__NSIG)

제가 아는 바로는 매크로의 발생 가능성이 있다는 것을 알고 있습니다.

  1. 이 프로젝트 자체에서, 어떤 소스 파일에서 (어떤 도구로 찾을 수 있기 때문에 이것이 가장 쉽습니다)
  2. 어떤 3번째 lib의 헤더 파일에서 우리는 그것을 얻을 수 있습니다.
  3. c/c++ 표준 헤더 파일에서 (linux의 어디에 있습니까?)
  4. OS에서 (리눅스 어디에 있습니까?)
  5. 구성 도구에 의해 자동으로 생성됩니다(쓴다, 나는 모른다).
  6. gcc/g++ 같은 컴파일러 도구나 makefile에서 매크로를 정의할 수 있습니다.

상담할 질문이 있습니다.

  1. os 정의된 것과 gcc/g+ 정의된 것을 어떻게 구별하고 툴 생성 매크로를 구성할 것인가 ? 각각 어떤 특징이 있습니까?
  2. os 또는 표준 C 또는 컴파일러에 의해 정의된 것들의 출처를 찾는 방법? 예를 들어, 사용하기grep아니면find공익 사업
  3. 만약 다음과 같은 하나의 매크로가 있다면 그것은 무엇을 의미합니까?__strange___전체 기계를 샅샅이 뒤져서 찾을 수 없습니다 (cd /;grep __strange___ -r)?

원리와 방법을 알려주셔서 감사합니다. 그리고 그것들의 근원을 찾아주세요!

매크로가 정의된 위치를 간단하게 확인할 수 있는 방법은 매크로를 다시 정의하고 컴파일러의 Warning/Error 메시지를 확인하는 것입니다.

#include <windows.h>
#define min(a,b) nonsense

mintest.cpp(3) : warning C4005: 'min' : macro redefinition
    C:\Programme\Microsoft SDKs\Windows\v6.0A\include\windef.h(194) : see previous definition of 'min'
  1. os 정의된 것과 gcc/g+ 정의된 것을 어떻게 구별하고 툴 생성 매크로를 구성할 것인가 ? 각각 어떤 특징이 있습니까?

대다수는 어딘가에 있는 어떤 헤더 파일에 정의되어 있습니다.gcc -dN -E도움이 될 겁니다주의 사항:이 접근 방식을 사용하는 경우 다음을 호출해야 합니다.gcc -dN -E동일한 경로, 동일한 경로를 포함하여-D<name>명령줄 옵션, 동일한 환경 변수(예:CPATH, 소스를 개체 파일에 컴파일할 때와 마찬가지입니다.

  1. os 또는 표준 C 또는 컴파일러에 의해 정의된 것들의 출처를 찾는 방법? 예를 들어 grep 또는 find 유틸리티를 사용하는 것.

RTFM. 자세한 설명서를 읽어보세요.

  1. 만약 다음과 같은 하나의 매크로가 있다면 그것은 무엇을 의미합니까?__strange__전체 기계를 샅샅이 뒤져서 찾을 수 없습니다.(cd /;grep __strange___ -r)?

그 기호가 컴퓨터에 정의되어 있지 않다는 것을 의미할 수 있습니다.문제의 코드가 C++ 표준을 준수하지 않는 다양한 시스템, 다양한 컴파일러를 대상으로 하는 오픈 소스 패키지의 코드라고 가정합니다.일반적인 접근 방식은#ifdef __some_bizarre_os__암호의 주요 부분에서 는 기괴한 사용자의되지 않습니다.이 기호는 기괴한 OS를 실행하는 컴퓨터에서만 정의됩니다. 사용자의 기호에서는 정의되지 않습니다.

불행하게도, 그 사건만이 아닙니다.그래프가 어디에서도 찾을 수 없더라도 기호는 정의될 수 있습니다.makefile은 두 개의 문자열을 연결할 수 있고,-D__str그리고.ange__컴파일러에 대한 단일 명령줄 인수를 형성합니다.옵션을-D__strange__makefile에서 사용하는 환경 변수 중 하나에서 잘 보이는 곳에 숨어 있을 수 있습니다.일부 프로젝트에서 요구하는 ~/.tcshrc 파일은 엄청나게 복잡할 수 있습니다.

갱신하다
gcc -dM -E는 매크로의 정의를 보여주지만 정의된 위치는 보여주지 않습니다.훨씬 더 나은 선택은 사용하는 것입니다.gcc -dN -E첫 글자로 시작하지 않는 선들을 걸러내는 겁니다#.

gcc 컴파일러 정의 매크로는 다음에 의해 드러날 수 있습니다.

gcc  -dM -E a.c

그 외에는 모두 포함된 파일과 소스에서 가져온 것입니다.

매크로를 찾을 수 없으면 조건이 거짓으로 평가됩니다.

또한 -v 옵션을 사용하면 기본 포함 디렉토리를 찾을 수 있는 위치를 알 수 있습니다.

매크로가 어떤 파일에서 왔는지 확인하려면:

gcc -E $your_compile_options $your_c_file | \
egrep "^# " | grep -v '<'| cut -f 2 -d '"' | \
sort | uniq |
while read line
    do
            grep -l $your_macro $line
    done

다른 분들이 말씀하신 것처럼.gcc한 사람과 함께-d매크로가 정의된 위치를 알아내려면 옵션을 사용해야 합니다.해당 옵션은 다음과 같이 출력되지 않습니다.gcc -v --help, 그래서 그들은 3.11장의 매뉴얼을 사용하여 읽혀야 합니다.-dCHARS.

마지막으로 저의 조치는 다음과 같습니다.

  1. 사용하다gcc ... -E -dD
  2. 출력 파일에서 정의 찾기
  3. 뒤로 검색#(해시와 공백) 파일을 드러내기 위해

이 매크로들은 컴파일 상수인 것 같습니다.

이러한 매크로를 사용하여 컴파일러에게 코드의 이 부분은 컴파일되어야 하며 코드의 이 부분은 컴파일되지 않아야 한다고 말하는 것이 좋습니다.

프로젝트 작업 공간에서 해당 코드를 검색할 수 없는 경우 프로그램 흐름을 살펴보고 애플리케이션에 필요한 코드 부분을 결정하고 해당 매크로를 정의해야 합니다.

예를 들어,

#ifdef (_CASE1_)

...
...
...

#elif (_CASE2_)

...
...
...

#endif

위의 예에서 만약 코드가 아래에 적용된다면._CASE1_응용 프로그램에서 필요한 경우 다음을 정의해야 합니다._CASE1_.예.#define _CASE1_

도움이 되기를...

오픈 소스 프로젝트를 연구하고 있다면 구축할 수 있도록 설정했을 것입니다.찾고자 하는 매크로가 들어 있는 파일을 하나 선택하고 컴파일러를 사용하여 전처리된 파일을 생성합니다.실제 옵션은 사용하는 컴파일러에 따라 다릅니다. gcc의 경우 -E입니다. 여기서 더 많은 정보를 찾을 수 있습니다.

프로젝트의 빌드 시스템을 사용하여 실제로 파일을 컴파일하고 전처리기를 실행하는 데 필요한 옵션을 확인해야 할 수도 있습니다.

전처리된 파일이 있으면 매크로를 검색하면 됩니다.포함된 각 파일의 경로 이름을 생성하는 전처리기 옵션이 있습니다.

업데이트: 매크로가 프로세서에 의해 확장되기 때문에 이 접근 방식은 분명히 작동하지 않습니다.따라서 확장된 형태나 효과를 인식할 수 없다면 별 소용이 없을 것입니다.

좀 더 유용한 것은 컴파일러가 포함된 파일의 정확한 순서를 인쇄하도록 하는 것입니다.이는 -H 옵션을 사용하면 gcc에서 달성됩니다.

매크로를 마우스 오른쪽 버튼으로 클릭하고 선언 열기를 클릭하면 파일로 전송되고 매크로가 정의된 줄을 이클립스와 같은 IDE를 사용해야 합니다.

일부 매크로는 gnu 컴파일러에 플래그로 제공되기 때문에 헤더 파일에 정의되지 않는 경우도 있습니다(예: -DMYMACRO).

저는 Vim을 충분히 찾을 수 있습니다.CTRL-W CTRL-I그리고.[I내가 가장 좋아하는 것은.(이것들은 모든 종류의 식별자이며,CTRL-W CTRL-D그리고.[D매크로 전용입니다.)타이핑가능:help include-search사용 가능한 명령어의 전체 목록에 대해 설명합니다.

이것들이 작동하려면, 당신은 당신의 것을 가지고 있어야 합니다.pathVim의 옵션이 올바르게 설정되었습니다.e:set path?현재 설정을 확인합니다. 실행합니다.gcc -v -E -x c++ - </dev/null,#include <...> search starts here:, 디렉토리를 복사하여 사용자의 디렉토리에 추가합니다.path의)에.vimrc). (내가 하는 일은 디렉토리를 추출하여 환경 변수에 저장하는 것입니다..bash_profile, 그리고 그것을 나의 것에 참고하세요..vimrc, 와 같이set path=$INCLUDE_PATH.) 프로젝트별 포함 디렉터리를 추가해야 할 수도 있습니다.path뿐만 아니라.

언급URL : https://stackoverflow.com/questions/11257455/how-to-find-the-source-of-some-macros