boost - 在C / C++预处理程序中,它自己的行上单个井号/散列符号(#)的目的是什么?





c-preprocessor (4)


一条线上的#本身完全没有效果。 我认为它被用于审美价值。

C标准说:

6.10.7空指令

语义

表单的预处理指令

# new-line

没有效果。

C ++标准也是这样说的:

16.7空指令[cpp.null]

表单的预处理指令

# new-line

没有效果。

我一直在寻找Boost库的源代码,并且我已经注意到,通常没有任何预处理器指令附加在它们上面的单个井号。 我通读了GCC预处理器手册和规范指南,并且找不到任何相关内容。

(1) #ifndef BOOST_CONFIG_HPP
(2) #  include <boost/config.hpp>
(3) #endif
(4) #
(5) #if defined(BOOST_HAS_PRAGMA_ONCE)
(6) #  pragma once
(7) #endif

在第4行,英镑符号后没有任何东西。 这有什么影响? 它是否在C预处理器(CPP)规范中定义?

由于Boost是一个跨平台的库,我认为任何CPP都应该正确解析它。 整个代码中随机英镑/散列符号的效果/副作用是什么?




始终检查权威来源,而不是依赖其他资源。 C被标准化为ISO 9899 :: 2011,C ++也具有ISO标准。 两者都被广泛接受,并通过短期搜索提供最终草案。 6.10.7的C标准状态(C ++有很多相同的文本):

表单的预处理指令

# new-line

没有效果。

这是一个空指令 ,就像一个; 在核心语言中没有前面的表达式是一个空语句

对于预处理器来说,它只是用于格式化/可读性来强调这些行在语义上属于一起。 (分号OTOH在语义上是相关的)。




它使源代码看起来很漂亮,就这些。

突出显示整个模块是预处理器部分的事实。

事实上,C和C ++预处理器都必须忽略一行中的#




根据SDL Windows常见问题解答

即使您正在创建Windows应用程序,也应该使用main()而不是WinMain() ,因为SDL提供了一个WinMain()版本,它在调用主代码之前执行一些SDL初始化。

如果由于某种原因你需要使用WinMain() ,请查看src/main/win32/SDL_main.c中的SDL源代码,看看你需要在WinMain()函数中做什么样的初始化,以便SDL工作正常。

SDL需要初始化,因此它会在调用“main”函数之前注入自己的main函数,该函数会运行其初始化,它将重命名为SDL_main以便它不会与实际的main函数冲突。 如FAQ中所述,您的main功能必须是表格

int main(int argc, char* argv[])




c++ c boost c-preprocessor