预定义宏和 C++11

Predefined macros and C++11

据我所知,预定义宏和操作(如#ifdef、#define...等)与编译器相关,与语言标准无关。

我的问题是:

  1. 以上是真的吗?完全正确?和例外?
  2. 下面的代码是否完全符合 C++11 有效、标准和最佳实践?

    //Some includes here
    
    #define CONCURRENCY
    
    int main(){
        //some code here
        #ifdef CONCURRENCY
            concurrency::parallel_for_each(begin(solutions), end(solutions), [&](schedule_& solution){
        #else 
            for (auto& solution:solutions){
        #endif
            //Some code here
        #ifdef CONCURRENCY
            });
        #else
            }
        #endif
    }
    

编辑: 有点超出问题范围:

上面的代码是提供使用和不使用并发选项编译代码的最佳方式吗?

您的代码是正确的。 (就宏的使用而言,我并没有真正"parse"代码本身。)

C 预处理器指令——过度简化,"the stuff that starts with #something"——在编译器实际获取"see"代码之前进行处理。 (它们仍然是语言标准的一部分,即与该语言在同一篇论文中定义。)

只要您使用 C 预处理器产生有效代码,编译器就会接受它。

有些事情影响编译器。例如,#pragma 引入了 实现定义的 功能。这也包含在语言标准中。


至于"best practice",#ifdef / #else / #endif 并不是最简洁的设计,但有时它是解决平台问题的最快方法。与 C/C++ 中的基本所有内容(如可怕的宏)一样,只要你不过分就没关系。将它放在某个中心位置(而不是让它散布在你的代码库中),并对其进行记录,以便跟随你的人可以理解你的 #ifdef,并可能用更好的替换它们解决方案。

  1. 以下预处理器指令

    • #include
    • #define
    • #undef
    • #if
    • #ifdef
    • #ifndef
    • #error

    在 C/C++ 中具有标准行为。

    #pragma 指令就像一个异常,因为它是由编译器或其他外部东西解释的。

  2. 您的代码在 C++11 中有效且符合标准,但未遵循最佳实践。不鼓励使用预处理器指令。当前 C++ 语言的开发努力旨在完全消除预处理器的需要。相反,您可以使用其他静态代码生成技术,如模板元编程。