例如:
//
// 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计划来说是必要的。
答案 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;
}