1

对不起,我的英语不好。

例如 :

//
// 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 程序来说是必需的。

4

2 回答 2

4

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

手册

例如,给定一个固定版本的 main(应该#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
于 2012-10-19T08:43:10.000 回答
3

您不能动态包含任何标题,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;
}
于 2012-10-19T07:51:36.220 回答