Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何以及在何处定义预处理器指令,以便在项目中的任何地方都可以访问它们?_C++_C Preprocessor - Fatal编程技术网

C++ 如何以及在何处定义预处理器指令,以便在项目中的任何地方都可以访问它们?

C++ 如何以及在何处定义预处理器指令,以便在项目中的任何地方都可以访问它们?,c++,c-preprocessor,C++,C Preprocessor,这里的意图是,当程序启动时,一个特定的函数将读取一个配置文件并设置一些#defines。在本项目的其他部分中,这些预处理器指令将决定执行哪些代码以及不执行哪些代码 示例: 文件X包含: #定义0的内容 文件Y包含: #如果(什么) //执行此操作 这些类型的#定义应该如何组织,以及在何处组织,以便可以在不造成混乱的情况下访问它们?预处理器指令是在编译程序时解决的,而不是在程序启动时解决的,因此您所要求的无法完成 您需要一个运行时机制来实现这一点,但这并不能保证代码从已编译的二进制文件中排除。预处

这里的意图是,当程序启动时,一个特定的函数将读取一个配置文件并设置一些
#define
s。在本项目的其他部分中,这些预处理器指令将决定执行哪些代码以及不执行哪些代码

示例:
文件X包含:
#定义0的内容

文件Y包含:
#如果(什么)

//执行此操作


这些类型的
#定义
应该如何组织,以及在何处组织,以便可以在不造成混乱的情况下访问它们?

预处理器指令是在编译程序时解决的,而不是在程序启动时解决的,因此您所要求的无法完成


您需要一个运行时机制来实现这一点,但这并不能保证代码从已编译的二进制文件中排除。

预处理器指令是在程序编译时解析的,而不是在程序启动时解析的,因此您所要求的无法完成

您需要一个运行时机制来实现这一点,但这不能保证代码从已编译的二进制文件中排除

这里的目的是当程序启动时,一个特定的 函数将读取一个配置文件并设置一些#定义。在里面 这个项目的其他部分,这些预处理器指令将决定 执行什么代码,不执行什么代码

正如另一个答案所说,这是不可能的,因为像
#define
这样的预处理器指令是由编译器的预处理器使用的。您的可执行二进制文件实际上看到的是编译后的修改源代码,无论您每次使用不同的文件运行,该代码都保持不变。此外,没有一个概念,比如加载配置文件和改变运行时间,因为C++是编译语言而不是解释的。 实际上可能的是

  • 加载配置文件(最好采用单机版格式)
  • 使用标准格式的公共可用库对其进行解析,或者编写自己的解析器
  • 使用像map这样的STL对象在配置键和值之间创建映射
  • 将STL放在某个名称空间中,以免污染全局名称空间并使其成为外部名称空间。确保头文件中存在外部声明,并且在.cpp文件中定义了该变量,以便可以从不同于定义该变量的转换单元访问该变量
  • 在程序中的任何位置使用映射的配置
这里的目的是当程序启动时,一个特定的 函数将读取一个配置文件并设置一些#定义。在里面 这个项目的其他部分,这些预处理器指令将决定 执行什么代码,不执行什么代码

正如另一个答案所说,这是不可能的,因为像
#define
这样的预处理器指令是由编译器的预处理器使用的。您的可执行二进制文件实际上看到的是编译后的修改源代码,无论您每次使用不同的文件运行,该代码都保持不变。此外,没有一个概念,比如加载配置文件和改变运行时间,因为C++是编译语言而不是解释的。 实际上可能的是

  • 加载配置文件(最好采用单机版格式)
  • 使用标准格式的公共可用库对其进行解析,或者编写自己的解析器
  • 使用像map这样的STL对象在配置键和值之间创建映射
  • 将STL放在某个名称空间中,以免污染全局名称空间并使其成为外部名称空间。确保头文件中存在外部声明,并且在.cpp文件中定义了该变量,以便可以从不同于定义该变量的转换单元访问该变量
  • 在程序中的任何位置使用映射的配置

#定义用于编译,而不是运行时。。。。因此,您需要变量和
if()
#定义用于编译,而不是运行时。。。。因此,您需要变量和
if()
感谢您。请您用一个例子来解释一下-
将STL放在某个名称空间中,这样就不会污染全局名称空间,并使其成为静态外部变量。
@theindependentquarius:将变量放在名称空间中可以最大限度地减少定义全局变量的噩梦。制作一个变量extern(很抱歉静态是一个输入错误)将确保您可以从所有cpp程序访问该变量。感谢您。请您用一个例子来解释一下-
将STL放在某个名称空间中,这样就不会污染全局名称空间,并使其成为静态外部变量。
@theindependentquarius:将变量放在名称空间中可以最大限度地减少定义全局变量的噩梦。创建一个变量extern(很抱歉静态是一个输入错误)将确保您可以从所有cpp程序访问该变量。