为什么预处理器命令必须从第一个非白色空间开始

mar*_*rsh 3 c++ visual-studio c-preprocessor

我试图通过一个setter线进行#ifndef部分方式,我收到了这个错误

"错误20错误C2014:预处理器命令必须作为第一个非白色空间启动"

我知道错误的意思,我只是好奇为什么会这样?它是编译器的选择吗?这背后的原因是什么?用户更容易注意到?

如果有人想知道这是代码:

inline void SetSomething(int value) { #ifndef XBOX ASSERT(value <= 1); #endif test = value; };
Run Code Online (Sandbox Code Playgroud)

Che*_*Alf 5

起初,C没有任何标准预处理器.然后人们开始使用预处理作为外部工具.您可能会注意到,这#与Unix-land shell脚本中的注释相同.

随着语言的发展,预处理器与编译器和语言本身的更多部分集成在一起,但它保持了完全不同的结构,即,特别是它是面向行的,而C和C++核心语言是自由形式.

之后,线条模糊了一点.现在,预处理通常会添加#line指令或等效内容供核心语言编译器使用,#pragma指令也适用于核心语言编译器,而另一方面则指向_Pragma(IIRC).结构仍然大部分与原来一样.C和C++是进化语言,而不是设计语言.