문제

한 디버깅 및 로깅,라이브러리를 찾아,런타임에,목록은 모든 소스 파일을 프로젝트를 컴파일하고 있와 연결되어 있습니다.나는 가정이 나는 것을 포함한 어떤 종류에서 헤더의 각 소스 파일의 전처리기는__파일__매크로를 줄 수 있는 나에게 일정한 문자는 파일에서 어떻게 든"방송"하는 정보를 각 파일로부터 수집되는 것을 통해 런타임 기능입니다.

질문입니다 어떻게 우아하게 이렇게,특히 경우에서 수행 할 수 있습 C 반대로 C++.에서는 C++나는 가능하게 만들려고 클래스와 함께 정관의 목록은 파일명.각각의 헤더 파일은 파일을 만들고 지역의 정적 인스턴스는 클래스는 생성에 추가한 파일 포인터 또는 어떤 클래스의 정적 데이터 구성원들은 아마도로 연결 목록입니다.

그러나 나는 생각하지 않는 이 작품에서는 C,심지어는 C++에서 나는 확실하지 않다 그것의 보장 각 요소는 생성될 것입니다.

도움이 되었습니까?

해결책

나는 코드에서 그런 일을 제대로하지 않을 것입니다. 프로젝트 파일 (vcproj, makefile 또는 * .c * 파일에 대한 프로젝트 디렉토리를 스캔)을 구문 분석하고 어떤 종류의 사전에 모든 소스 파일의 이름을 포함하는 추가 C 소스 파일을 생성하는 도구를 작성합니다. 초기화 된 데이터 구조.

그런 다음 빌드 프로세스의 해당 도구 부분을 만들어 빌드를 할 때마다 모든 것이 자동으로 발생합니다. 실행 시간에, 당신이해야 할 일은 구축 된 데이터 구조를 읽는 것입니다.

다른 팁

동의함으로 페루,가장 좋은 방법이에서 빌드 시스템,지 코드 자체입니다.로의 확장을 자신의 아이디어를 추가 표적을 구축하는 시스템을 덤프하는 파일의 목록(는 그것을 알고 어쨌든)C 파일에 문자열로,또는 문자열의 배열을,그리고 이 파일을 컴파일로도 매우 중요합니다.이러한 방법을 많이 합병증의 원본에서,그리고 확장 가능,추가하려는 경우 추가적인 정보처럼,버전 번호를 소스 코드에서 제어 시스템 구축 실행,etc.

UNIX 및 Linux에는 표준 방식이 있습니다. ident. 모든 소스 파일에 대해 ID 태그를 만듭니다. 일반적으로 버전 제어 시스템에 의해 지정됩니다 (예 : SVN 키워드.

그런 다음 사용하는 각 소스 파일의 이름과 개정을 찾으려면 ident 명령. 런타임에 해야하는 경우 방법을 확인하십시오. ident 그것을합니까 - 소스를 자유롭게 사용할 수 있어야합니다.

C ++에서는 다음과 같은 클래스를 만들 수 있습니다.

struct Reg {
   Reg( const char * file ) {
      StaticDictionary::Register( file );
};

여기서 staticDictionary는 모든 파일 이름을위한 싱글 톤 컨테이너입니다. 그런 다음 각 소스 파일에서 :

static Reg regthisfile( __FILE__ );

사전을 만들고 싶을 것입니다 메이어스 창조 문제의 순서를 피하기위한 싱글 톤.

나는 당신이 "수동적"모드에서 요약하는 방식으로 이것을 할 수 있다고 생각하지 않습니다. 즉, 각 소스 파일에 대해 어떻게 든 코드를 실행하여 레지스트리에 추가되므로 자동으로 발생하기가 어렵습니다.

물론, 매크로를 사용하여 해당 코드를 매우 눈에 띄지 않게 만들 수 있습니다. "EntryPoint"가없는 C 소스 파일에 문제가있을 수 있으므로 코드가 아직 "모듈"으로 구성되지 않은 경우 init() 각 모듈의 기능은 어려울 수 있습니다. 정적 초기화 코드가 가능할 수 있습니다. 사물이 초기화되는 순서가 여기에 문제를 일으키는 지 100% 확신하지 못합니다.

사용 static 레지스트리 모듈의 스토리지는 우수한 아이디어처럼 들리며, 일반적인 목적 유틸리티 라이브러리가 포함되어 있지 않은 경우 일반 링크 목록 또는 간단한 해시 테이블은 쉽게 구현할 수 있어야합니다.

C ++에서는 솔루션이 작동합니다. 보장됩니다.

편집하다: 방금 내 머리 속에 솔루션을 찾았습니다. makefile의 규칙을 변경하여 '-include "cfiles_register.h"를 각'g ++ file.cpp '에 추가하십시오.

%.o : %.cpp
    $(CC) -include 'cfiles_register.h' -o $@ $<

제안 된 질문에 'cfiles_register.h'에 대한 질문에 넣으십시오.

C ++에서 정적 인스턴스를 사용하면 제대로 작동합니다.

C 에서도이 작업을 수행 할 수 있지만 MSVC CRT를 위해 런타임 특정 기능을 사용해야합니다. http://www.codeguru.com/cpp/misc/misc/threadsprocesses/article.php/c6945/

C- 매크로로 수행 할 수 있습니다. 파일에 해당하는 변수를 정의 한 다음 아이디어로 실행 파일의 기호를 스캔 할 수 있습니다.

 #define TRACK_FILE(name) char _file_tracker_##name;

my_c_file.c에서 다음과 같이 사용하십시오.

 TRACK_FILE(my_c_file_c)

그리고 이진과 같은 바이너리의 모든 파일/변수 이름을 그릴보다

nm my-binary | grep _file_tracker

정말 좋지는 않지만 ...

끔찍한 생각은 확실하지만 싱글 톤을 사용합니다. 그리고 각 파일에서는 같은 일을합니다

  Singleton.register(__FILE__); 

글로벌 범위에서. 그래도 CPP 파일에서만 작동합니다. 나는 몇 년 전 초보자로서 같은 일을했는데 효과가있었습니다. 그러나 나는 지금 그것을 할 것입니다. 지금 빌드 단계를 추가하겠습니다.

런 타임 에이 작업을 피하는 것이 낫다고 말하는 사람들에게 동의하지만 C에서는 모든 파일에서 함수 호출로 정적 변수를 초기화 할 수 있습니다.

static int doesntmatter = register( __FILE__);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top