【问题标题】:C++, How include .h dynamicallyC++,如何动态包含 .h
【发布时间】:2012-10-19 07:47:50
【问题描述】:

抱歉我的英语不好。

例如:

//
// File : Main.cpp
// 
#include <stdlib.h>
int main()
{
  printf(TEST_DEFINE);
  return (EXIT_SUCCESS);
}

标题:

//
// File : test_define.h
//
#ifndef TEST_DEFINE_H_INCLUDED
#define TEST_DEFINE_H_INCLUDED

#define TEST_DEFINE

#endif

我想通过编译器或其他程序包含该标头。我不想在 CPP 文件中包含此标头。

我该如何处理?我对所有提案持开放态度。

这种情况非常棘手,但对于我的 POC 程序来说是必需的。

【问题讨论】:

  • Microsoft VC 编译器有一个/FI 开关,强制在每个源中包含标头。
  • 您听说过 gcc 编译器选项 -Dname=value 吗?
  • 为了它,让我们问...为什么你需要这样做?您要问的问题在标准 C++ 中并不值得做,而您尝试解决的问题可能会以其他方式更好地解决。这种方式是什么,当然取决于问题。
  • “动态”到底是什么意思?
  • 谢谢,我去探索你的提议,我所说的“动态”是指,不在 CPP 文件中声明标题。

标签: c++ header


【解决方案1】:

GCC 有一个选项 -include file 导致预处理器包含标题,就好像你的程序的第一行说 #include "file"

manual

例如给定一个固定版本的 main(应该是 #include &lt;stdio.h&gt;):

#include <stdlib.h>
#include <stdio.h>
int main()
{
  printf(TEST_DEFINE);
  return (EXIT_SUCCESS);
}

和你的标题:

//
// File : test_define.h
//
#ifndef TEST_DEFINE_H_INCLUDED
#define TEST_DEFINE_H_INCLUDED

#define TEST_DEFINE "hello\n"

#endif

然后我可以这样使用它:

$ g++ -include test_define.h main.cpp -o main
$ ./main
hello

【讨论】:

    【解决方案2】:

    您不能动态包含任何标题,C++ 是一种静态语言。

    您需要使用#include "test_define.h" 静态包含标题

    您唯一的选择是自己编写一个 C++ 解析器(或使用现有的解析器),读取头文件,解析它并从符号树中提取您想要的符号。但除非您是具有多年核心编程经验并且能够解释为什么需要这样做的人,否则您永远不应该这样做。


    好的,所以我们不是在谈论任何动态的东西,我们谈论的是包含一些定义的头文件的普通旧 #include

    你想要的是以下内容:

    一个文件my_header.h 包含:

    #ifndef TEST_DEFINE_H_INCLUDED
    #define TEST_DEFINE_H_INCLUDED
    
    enum {foo, bar} my_enum;
    
    #endif
    

    还有一个文件my_program.cc 包含:

    #include "my_header.h"
    
    int main(int argc, char** argv) {
      my_enum my_variable = foo;
    
      return my_variable == foo ? EXIT_SUCCESS : EXIT_FAILURE;
    }
    

    【讨论】:

    • 这只是一个例子的函数调用,它只是为了使用我的定义
    • "自己编写 C++ 解析器" - 我认为最好删除它。既不实用,也不合理。 OP 与此无关。
    • @KirillKobelev 我只是在陈述事实并明确指出,如果无法解释为什么需要这样做,则永远不应该这样做。
    • 实际上我没有生成带有枚举的头文件,我尝试通过 gcc 或其他进程包含这个头文件
    • 那你为什么需要动态包含它呢?我在回答中提到的#include 不是dynamic,而是static。通常,当人们说静态时,他们的意思是在编译时确定的东西,当他们说动态时,他们的意思是在运行时确定的东西。你提到的头文件名在编译时是固定的,我想?在那种情况下,您的问题没有任何动态,我们只是在谈论一个普通的旧静态#include
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2016-11-15
    • 2013-09-04
    • 2019-05-23
    • 2010-12-16
    • 1970-01-01
    • 2014-11-26
    相关资源
    最近更新 更多