c++ - 预处理器指令应该在行首吗?

标签 c++ c c-preprocessor

不久前,我发现了一个(相当古老的)C 编译器,它以这种方式扫描宏(伪代码):

 if line.startswith("#include") or line.startswith("#define"):
     ...

.. 哪一种对我提出了一个问题,宏应该真正放在哪里,在一行的开头,就像这样:

void stuff()
{
#if defined(WIN32) || defined(_WIN32)
    ...
#else
#if defined(__GNUC__)
    ...
#else
    ...
#endif
#endif
}

或者更确切地说是这样(我就是这样做的,以提高可读性):

void stuff()
{
    #if defined(WIN32) || defined(_WIN32)
    ...
    #else
    #   if defined(__GNUC__)
    ...
    #   else
    ...
    #   endif
    #endif
}

预处理器代码的缩进方式是否标准化,即无论我如何缩进它,它总是以相同的方式工作?

最佳答案

一些旧的 C 编译器要求 #define(例如)与左边距齐平:

#define FOO bar

其他 C 编译器只要求 # 位于左边距,因此您可以:

#    define FOO bar

较新的 C 编译器倾向于在任何前导空格之后接受 #:

    #define FOO bar

如果你想与这些旧的编译器兼容,你至少应该把你的 # 放在第一列。如果兼容性无关紧要,那就看你自己了。

我通常会尽量不在函数中嵌入 #ifdef block ,因此它们是否应该缩进的整个问题大部分都消失了。

关于c++ - 预处理器指令应该在行首吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4721978/

相关文章:

arrays - 动态分配内存到数组并读取大文本文件

c++ - 在编译时检测 C++ 中的函数

c++ - 传递\in C++ 的命令行参数

c++ - 如何在 C++ 中使用全局变量?

ios - Xcode 8 和预处理器宏

c - 在 C 中定义类似函数的宏时,使用 {} 对或 () 对有什么区别吗?

C 预处理器 #define 声明的变量是什么类型?

C++11 std::thread vs windows CreateThread

c++ - 使用具有新信号槽语法的 Qt 插件系统在接口(interface)类中声明信号

c - 无法使文件 I/0 在周期计数器功能 -c 中工作