TestForANSIForScope

此模块检查 CXX 编译器是否将 for-init-statement 中声明的变量的作用域限制在循环体内。

在 CMake 项目中加载此模块,使用

include(TestForANSIForScope)

在早期 C++(C++98 之前)中,在 for(<init-statement> ...) 中声明的变量在循环体结束后(for() { <body> })仍然可以在循环外部访问。

此模块定义了以下缓存变量

CMAKE_NO_ANSI_FOR_SCOPE

一个缓存变量,包含检查结果。如果 for-init-statement 的作用域受限(C++ 98 及更新版本),则其值为 0;如果不受限(ANSI C++),则其值为 1

注意

根据 C++ 98 标准,在 for-init-statement 中声明的变量的作用域被限制在循环体内,这使得该行为已过时。

示例

包含此模块将检查 for() 循环作用域行为,并定义 CMAKE_NO_ANSI_FOR_SCOPE 缓存变量

CMakeLists.txt
include(TestForANSIForScope)
file(
  CONFIGURE
  OUTPUT config.h
  CONTENT "#cmakedefine CMAKE_NO_ANSI_FOR_SCOPE"
)

之后可以在 C++ 程序中使用

example.cxx
#include "config.h"

#ifdef CMAKE_NO_ANSI_FOR_SCOPE
#  define for if(false) {} else for
#endif

另请参阅