C++ c++;:是否可以#包含在功能体中?

C++ c++;:是否可以#包含在功能体中?,c++,C++,我只想在调用某个函数体时包含头文件 这是可能还是推荐在C++中?< /p> 可能,是的;建议不要,通常不要 #include是一个过程,也是语法分析的早期阶段,因此在许多地方都可以工作,而不考虑include时的语言上下文 请注意,无论函数是否被调用,include都会发生,因此它可能无法解决您试图解决的问题。包含的文件将直接放置在函数体中,因此必须将包含文件设计为包含在源文件中的某个位置。否 你弄错了一点#include根本不在运行时处理。不可能根据程序的执行特征包含文件;一旦程序执行,它的源

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


这是可能还是推荐在C++中?< /p> 可能,是的;建议不要,通常不要

#include
是一个过程,也是语法分析的早期阶段,因此在许多地方都可以工作,而不考虑include时的语言上下文

请注意,无论函数是否被调用,include都会发生,因此它可能无法解决您试图解决的问题。包含的文件将直接放置在函数体中,因此必须将包含文件设计为包含在源文件中的某个位置。

你弄错了一点<代码>#include根本不在运行时处理。不可能根据程序的执行特征包含文件;一旦程序执行,它的源文件是固定的(因为它已经编译过了)。

您可以将其包含在函数体中,但这并不意味着只有在调用函数体时才包含头文件

头文件的内容将在编译时由预处理器包含,因此代码将始终出现在函数中


显然,代码仅在调用函数时执行。

虽然可以将
#include
放在函数体中,但这不是您想要做的。只有在调用某个函数时才能包含头文件,因为包含发生在编译时之前,但函数调用发生在运行时。

您显然对更高级的语言有偏见,例如Python,在Python中可以执行以下操作:

if ( a ):
  from whatever import whatever_I_need
else:
  from whatever_else import whatever_I_need

<>但是,在C++中,编译时进行评估(实际上,<强> >包含是预处理器指令,甚至在编译时进行评估)。将其放入if-else构造的块中只会导致编译错误。请注意,#include只是一种将文件内容(通常是头(接口)文件)转储到另一个需要声明的文件中的方法。非常低的水平。无论如何都会包括在内。

好吧,这个问题有点离题,但实际问题很重要

如果对于您的方法的一部分,您实际上需要依赖于大多数用户都不关心的库,那么愿意为他们提供这种不必要的依赖是完全合理的

可以通过操纵预处理器标记来实现这一点

/// 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
并且只包含“myProjectMyClass.h”,而不直接包含标题


这些预处理器指令的使用非常普遍。例如,在安装
cx\u Oracle
python模块时,安装程序从我的环境变量中检查了我使用的Oracle版本,并禁用了许多在编译时无法直接使用的方法。

在一个程序中,我需要在我的应用程序中使用(使用Qt)有:


当我粘贴include before main时,它不会编译,因此可以在函数中使用include;)

我想是这样的,但需要确认。#include更像是在编译开始之前将头文件粘贴到.cpp文件中。您的意思是:在运行时调用函数时。或者你的意思是在函数中使用#include?incude是在编译开始之前执行的预处理器指令,因此不能在运行时执行。但是您可以在函数中执行它(尽管我不推荐它(事实上我会发现它))。
// myProjectMyClass.h
#define MYPROJECT_BIGDEP_USE
#include <myClass.h>
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);

   using namespace PL;

   "#"include "res/przypisania_txt.h"

    MainWindow w;
    w.show();
    ...