c ++:在函数体内是否可以#include?

时间:2010-03-23 12:07:05

标签: c++

我想只在调用某个函数体时才包含头文件?

这是可行的还是推荐用C ++?

7 个答案:

答案 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;)