在VC ++中包含头文件路径

时间:2009-12-08 01:25:07

标签: c visual-c++ gcc vc6 header-files

环境:我正在使用MS-VC ++ 6.0,

  • 我包含一组头文件 一些数据。
  • 标题文件经常更改,依此类推 我改变路径的每一个改变 设置和重新编译
  • 基于的生成日志文件 包含头文件
  • 用于跟踪头文件 日志文件,我想打印 日志中的头文件路径

  • 问题1:正在获取标题 程序内部的文件路径 可能的?

  • 问题2:我正在使用VC ++,但是如果 它可以在gcc中,然后我可以 容易移植,所以,请告诉我, 如果有可能在任何其他 环境如gcc

5 个答案:

答案 0 :(得分:4)

在VC ++中,使用选项/FC进行编译会将当前处理过的文件的整个路径放在__FILE__宏中。

这将说明您对包含路径的更改。

Details here.

答案 1 :(得分:1)

当然 - 在头文件中放置:

static const char *header_path = __FILE__;

..然后只需将header_path指向的字符串打印到日志中。

答案 2 :(得分:1)

你的意思是拥有#include "path/to/header.h",你想从程序本身打印“path / to / header.h”吗?

#define INCLUDE_FILE "path/to/header.h"
#include INCLUDE_FILE

printf("Included: %s\n", INCLUDE_FILE);

答案 3 :(得分:0)

您可以获取此类包含文件的列表。

(project)
(export makefile)
(write dependencies when writing make files)

导出make文件,该文件创建.mak文件和.dep文件。 包含文件列在.dep文件中。

关于从正在运行的程序中获取包含文件的完整路径的想法。有人可能会使用msvc 6对象模型,从IDE中提取包含文件路径列表。一旦知道该列表。可以使用查找文件来搜索感兴趣的包含文件的路径列表。

答案 4 :(得分:0)

好的,这是一个解决方案(现在我希望我能正确理解你)。

它使用递归模板,__FILE__宏和__COUNTER__宏。 一个特殊的headerlisting.h头文件包含模板递归的逻辑,包括两个有用的宏(加上一些辅助宏)

  1. ADD_HEADER_FILE,只需将此行添加到您希望包含在列表中的每个标题文件中。
  2. LIST_HEADER(headers),您可以将其放入源代码,以便在运行时检索所有包含的头文件的列表
  3. 我确信有更简单的方法可以做到这一点,也许有Boost的模板p0werz,请发表评论。

    下面是第一个headerlisting.h,然后是一个包含两个示例标头和一个main()源文件的示例程序。这适用于使用g ++的Linux,希望它也适用于Visual Studio(现在无法测试)。

    <强> headerlogic.h

    #ifndef __HEADERLOGIC_H__
    #define __HEADERLOGIC_H__
    
    // By catchmeifyoutry, 2009-12-08
    //  See http://stackoverflow.com/questions/1863995/getting-included-header-file-path-in-vc
    
    #include <vector>
    #include <string>
    
    namespace HeaderListing
    {
    
    // Recursive templates to store header files, templatized by a header index I.
    // Header files will be stored by template specialization, adding new specializations
    // for every new header.
    //
    // The recursive headers depend on the assumption that the for the previous index I-1
    // there is a HeaderFile<I-1> defined which contains a method
    //   void HeaderFile<I-1>::list_headers(std::vector<std::string> &headers)
    // to list all I-1 previous header files.
    // The I-th HeaderFile then defines it's own list_header(...) to add one name
    // to the list.
    
    // -------------------------------------
    // Recursive case
    //    By default, list_headers() adds no name to the list, but if this default case
    //    is specialized with c-string for name, it will add to the list
    template <int I>
    class HeaderFile
    {
    public:
        typedef HeaderFile<I-1> PrevHeader;
    
        // in the specalization, this will store the name of header file;
        // but if no header with index I is given, name will be NULL by default
        static const char * name;
    
        // in the recursive case
        static inline void list_headers(std::vector<std::string> &headers)
        {
            PrevHeader::list_headers(headers);
            if (name != NULL) {
                headers.push_back(name);
            }
        }
    };
    template <int I> const char * HeaderFile<I>::name = NULL;
    
    // -------------------------------------
    // Base case
    //    Ensures recursion ends, implements dummy list_headers()
    template <>
    class HeaderFile<-1>
    {
    public:
        static inline void list_headers(std::vector<std::string> &headers)
        { /* end of recursion, do nothing! */ }
    };
    
    }; // namespace HeaderListing
    
    // -------------------------------------
    // Macros to add header files
    
    // Add n-th header file name (as a string) to the list
    #define ADD_HEADER_FILE_NAME_N(n, file) template <> const char * HeaderListing::HeaderFile<n>::name = __FILE__; \
    
    // Add a given string (e.g. a header filename) to the to the list
    //   Uses built-in __COUNTER__ macro to track the current header count.
    //   NOTE: it doesn't matter if count was used in between since there can be gaps in between the header indices
    #define ADD_HEADER_FILE_NAME(file) ADD_HEADER_FILE_NAME_N(__COUNTER__, file)
    
    // Add the current (header) file to the list
    //   Uses the built-in __FILE__ macro.
    #define ADD_HEADER_FILE ADD_HEADER_FILE_NAME(__FILE__)
    
    // List all defined header files
    //   The "headers" argument should be a std::vector<std::string>
    #define LIST_HEADERS(headers) HeaderListing::HeaderFile<__COUNTER__>::list_headers(headers);
    
    #endif // __HEADERLOGIC_H__
    

    现在为示例程序:

    <强> head1.h

    #ifndef __HEAD1__
    #define __HEAD1__
    
    #include "headerlisting.h"
    ADD_HEADER_FILE
    
    #endif // __HEAD1__
    

    <强> head2.h

    #ifndef __HEAD2__
    #define __HEAD2__
    
    #include "headerlisting.h"
    ADD_HEADER_FILE
    
    #endif // __HEAD2__
    

    <强> headertest.cpp

    #include <iostream>
    #include <vector>
    #include <string>
    
    #include "headerlisting.h"
    #include "head1.h" // <-- TRY COMMENTING THESE OUT!
    #include "head2.h" // <-- TRY COMMENTING THESE OUT!
    
    using namespace std;
    
    int main()
    {
        // list included header files
        vector<string> headers;
        LIST_HEADERS(headers);
    
        // display included header files
        size_t n = headers.size();
        cout << "Found " << n << " headers" << endl;
        for (size_t h = 0; h < n; ++h)
        {
            cout << "header " << h << " :\t" << headers[h] << endl;
        }
    
        return 0;
    }
    

    生成的输出应该如下所示(如果你没有从headertest.cpp中排除head1.h或head2.h,那么):

    Found 2 headers
    header 0 :  head1.h
    header 1 :  head2.h
    

    请告诉我这件事。