C ++,如何动态包含.h

时间:2012-10-19 07:47:50

标签: c++ header

抱歉我的英语不好。

例如:

//
// 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计划来说是必要的。

2 个答案:

答案 0 :(得分:4)

GCC有一个选项-include 文件,这会导致预处理程序包含标题,就像程序的第一行所说#include "file"

一样

请参阅manual

e.g。给定主要的固定版本(应该#include <stdio.h>):

#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

答案 1 :(得分: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;
}