我假设这里的每个人都熟悉所有文本文件应以换行符结尾的格言.多年来我一直都知道这个"规则",但我一直在想 - 为什么?
在某些C++编译器中出现以下警告的原因是什么?
文件末尾没有换行符
为什么我应该在源/头文件的末尾有一个空行?
使用此代码:
#include <iostream>
int main(int argc, char *argv[])
{
return 0;
}
/** run2: A macro to call a function. */
#define run2( function, ctype, dim ) \
if ( operation == #function ) \
{ \
if ( componentType == #ctype && Dimension == dim ) \
{ \
typedef itk::Image< ctype, dim > ImageType; \
function< ImageType >( inputFileName, outputFileName, radius, algorithm, useCompression ); \
supported = true; \
} \
}
Run Code Online (Sandbox Code Playgroud)
我收到一个警告:文件末尾的反斜杠换行符
知道怎么让它消失吗?
大卫
从C11 5.1.1.2 翻译阶段:
第 2 段:
[...]非空的源文件应以换行符结尾,在发生任何此类拼接之前,换行符前面不应紧接反斜杠字符。
这意味着每个源文件都必须以换行符结尾。
例子:
#include <stdio.h>
int main()
{
printf("Hello world\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的示例使用命令在 Clang 上编译clang prog.c -Wall -Wextra -std=gnu11 -pedantic。编译器生成以下警告:
prog.c:7:16: warning: no newline at end of file [-Wnewline-eof]
}
^
Run Code Online (Sandbox Code Playgroud)
没关系,因为源文件末尾没有换行符。
我使用gcc prog.c -Wall -Wextra -std=gnu11 -pedantic命令在 GCC 上编译了上述程序。GCC 不会生成任何警告或错误。
那么,为什么 GCC 不生成任何警告或错误呢?