我想只在调用某个函数体时才包含头文件?
这是可行的还是推荐用C ++?
答案 0 :(得分:11)
没有
你有点不对劲;根本不会在运行时处理#include
。根据程序的执行特性,#include
文件是不可能的;一旦程序执行它的源是固定的(因为它已经编译)。
答案 1 :(得分:7)
可能,是的;建议不,通常不会。
#include
是进程和解析的早期阶段,因此可以在很多地方工作,而不考虑包含点的语言上下文。
请注意,无论函数是否被调用,都会发生包含,因此它可能无法解决您尝试解决的问题。包含的文件将直接放在函数体内,因此包文件必须设计为包含在源文件中的这一点。
答案 2 :(得分:3)
你可以在函数体内部#include,但这并不意味着只在调用函数体时才包含头文件。
头文件的内容将在编译时由预处理器包含,因此代码将始终存在于函数中。
显然,在调用函数时,代码只是执行。
答案 3 :(得分:3)
你显然对高级语言(如Python)有偏见,可以做以下事情:
if ( a ):
from whatever import whatever_I_need
else:
from whatever_else import whatever_I_need
但是,在C ++中,这是在编译时进行评估的(实际上, #include 是一个预处理程序指令,甚至在编译时进行评估)。将它放在if-else结构的块中只会导致编译错误。只需考虑 #include 只是将文件内容(通常是标题(接口)文件)转储的方式转换为需要其声明的另一个文件。非常低的水平。无论如何它将被包括在内。
答案 4 :(得分:0)
虽然您可以在函数体中放置#include
,但不是您想要做什么。只有在调用某个函数时才能包含头文件,因为include在编译时发生,但函数调用在运行时发生。
答案 5 :(得分:0)
好的,问题有点偏离轨道,但实际问题很重要。
如果您的方法的一部分实际上需要依赖大多数用户不关心的库,那么愿意为这些不必要的依赖项做好准备是完全合理的。
您可以通过操作预处理程序令牌来完成此操作。
/// myClass.h
/// In order to use BigDep, you need to:
/// - define `MYPROJECT_BIGDEP_USE` before included this header
/// - have `<bigdep-install-path>/include` in your include path
/// - link with `libbigdep.so`
class MyClass
{
public:
void foo() const;
#ifdef MYPROJECT_BIGDEP_USE
void bigDep() const;
#endif // MYPROJECT_BIGDEP_USE
};
/// myClass.cpp
#include "blah.h"
#include "bar.h"
#ifdef MYPROJECT_BIGDEP_USE
#include <bigdep.h>
#endif // MYPROJECT_BIGDEP_USE
void MyClass::foo() const { /**/ }
#ifdef MYPROJECT_BIGDEP_USE
void MyClass::bigdep() { /**/ }
#endif // MYPROJECT_BIGDEP_USE
这样,您必须编译模式,具体取决于是否定义了符号MYPROJECT_BIGDEP_USE
。
在gcc上,您可以在-D
中使用-DMYPROJECT_BIGDEP_USE
在命令行中定义符号。在Visual Studio上,它与/D
中的/DMYPROJECT_BIGDEP_USE
一样。
用户的另一个选择是包装标题:
// myProjectMyClass.h
#define MYPROJECT_BIGDEP_USE
#include <myClass.h>
并且只包括“myProjectMyClass.h”而不是直接包含你的标题。
使用这些预处理程序指令非常常见。例如,在安装cx_Oracle
python模块时,安装程序检查了我在环境变量中使用的oracle版本,并禁用了许多在编译时直接无法使用的方法。
答案 6 :(得分:0)
在一个程序中,我需要在我的应用程序中使用(使用Qt):
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
using namespace PL;
"#"include "res/przypisania_txt.h"
MainWindow w;
w.show();
...
当我在main之前粘贴include时,它将无法编译,所以我猜你可以在函数中使用INCLUDE;)