Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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++_Visual Studio_C Preprocessor - Fatal编程技术网

C++ 为什么预处理器命令必须作为第一个非空格开始

C++ 为什么预处理器命令必须作为第一个非空格开始,c++,visual-studio,c-preprocessor,C++,Visual Studio,C Preprocessor,我正试图通过一条设定线做一个#ifndef,我收到了这个错误 “错误20错误C2014:预处理器命令必须作为第一个非空格启动” 我知道错误的意思,我只是好奇为什么会这样?这是编译器的选择吗?这背后的原因是什么?用户更容易注意到这一点 如果有人想知道,下面是代码: inline void SetSomething(int value) { #ifndef XBOX ASSERT(value <= 1); #endif test = value; }; inline void SetSome

我正试图通过一条设定线做一个#ifndef,我收到了这个错误

“错误20错误C2014:预处理器命令必须作为第一个非空格启动”

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

如果有人想知道,下面是代码:

inline void SetSomething(int value) { #ifndef XBOX ASSERT(value <= 1); #endif test = value; };

inline void SetSomething(int-value){#ifndef XBOX ASSERT(value起初C没有任何标准的预处理器。然后人们开始将预处理作为一种外部工具使用。您可能会注意到,
#
与Unix外壳脚本中的注释基本相同

随着语言的发展,预处理器和编译器和语言的大部分都集成在一起,但它保持了完全不同的结构,即,它是面向线的,而C和C++核心语言是自由形式的。


在这之后,行变得模糊了一些。现在预处理通常会添加
#line
指令或等效指令供核心语言编译器使用,
#pragma
指令也用于核心语言编译器,而在另一个方向上,我们现在有了
#pragma
(IIRC)这个结构大部分是原来的。C和C++是演化语言,不是设计语言。

如果你想最重要的原因,那是因为标准是这样说的。

如果您想知道标准为什么这么说,这是获得必要功能的最简单方法。

请记住,预处理和编译是两个可能完全独立的任务,预处理器根本不知道其输出的语言。

查看标准(第16节“预处理指令”)从#开始,作为第一个非空白字符,定义为预处理指令

预处理指令由满足以下约束的预处理令牌序列组成: 序列中的第一个标记是#预处理标记,它(在翻译阶段4开始时)是 源文件中的第一个字符(可选在不包含新行字符的空白之后)或 后跟至少包含一个新行字符的空白


你能展示触发此错误的代码吗?当然我添加了它,但我不确定有没有办法解决它。我想它是从70年代C预处理器形成时开始的……并在80年代在标准中得到了固定。为什么,不确定。那么,对于像
#define
这样的事情,预处理器如何知道
#define
替换的时间如果不是换行符,应该以换行符结束吗?解决方法是在代码中添加换行符。
内联
函数定义不必在一行上。我不认为
\u Pragma
实际上是一个预处理器,所以它不在“其他方向”。由于编译的各个阶段,@MSalters:
\u Pragma
的目的是在宏中可用(因为在宏中不能有像
\Pragma
这样的预处理器指令)。所以它是另一个方向,支持预处理器的核心语言的一部分。与支持核心语言的预处理器的一部分相比,
#pragma
。@Cheers-Sandhth.-Alf:但是
#pragma
不支持预处理器。事实上,它与此无关。
#pragma
也不是真正的p重新处理器指令——它恰好有一个看起来好像是一个的语法(如果是,它会如何影响对齐的东西)?@提姆:As:SaleC++标准将代码< > TracePrima<代码>作为预处理器指令。在C++ 98中,C++ 03、C++ 11和C++ 14(迄今为止的所有标准)都是16.6,命名为“Primar指令”。,在第16节,名为“预处理指令”。让我们同意该标准关于正式术语是正确的。这样,我们可以同意,
#pragma
不能通过单独的纯文本预处理来完全处理。这是我的重点。