#if条件区域可以包含文件边界吗?

时间:2016-02-28 22:29:08

标签: c++ c-preprocessor language-lawyer

在MSDN(https://msdn.microsoft.com/en-us/library/ew2hz0yd.aspx)中,我看到以下内容:

  

所有条件编译指令,例如#if和#ifdef,都必须   在文件结束之前匹配关闭#endif指令;   否则,将生成错误消息。条件编译时   指令包含在包含文件中,它们必须满足相同的要求   条件:必须没有不匹配的条件编译   包含文件末尾的指令。

嗯,简单明了。同时我在C ++ 11标准中找不到类似的东西。我的问题是这个法律限制吗?

我完全理解在几个#include层上拆分条件编译并不是一个好主意,应该避免使用。

有谁知道其他编译器(GCC,CLANG)如何处理这种情况?也许在某个地方讨论过这个问题?

1 个答案:

答案 0 :(得分:2)

#if FOO
#include "hashif.h"


extern "C" int printf(const char* fmt, ...);

int main()
{
    printf("Hello, World\n");
}

hashif.h包含:

#define BAR 1
#else
#define BAR 2
#endif

然后clang ++会出错。

hashif.cpp:1:2: error: unterminated conditional directive
#if FOO  
^
1 error generated.

修改:g++cpp的行为方式相同。

来自:

的确切输出
$ cpp hashif.cpp -DFOO=1
# 1 "hashif.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "hashif.cpp"

# 1 "hashif.h" 1
In file included from hashif.cpp:2:0:
hashif.h:2:2: error: #else without #if
 #else
  ^
hashif.h:3:0: warning: "BAR" redefined
 #define BAR 2
 ^
hashif.h:1:0: note: this is the location of the previous definition
 #define BAR 1
 ^
hashif.h:4:2: error: #endif without #if
 #endif
  ^
# 3 "hashif.cpp" 2


extern "C" int printf(const char* fmt, ...);

int main()
{
    printf("Hello, World\n");
hashif.cpp:1:0: error: unterminated #if
 #if FOO
 ^
}