预定义的宏和C ++ 11

时间:2015-11-08 13:57:58

标签: c++ c++11 macros

据我所知,预定义的宏和操作如#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
    }
    
  3. 修改: 有点超出了问题的范围:

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

2 个答案:

答案 0 :(得分:3)

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

C预处理程序指令 - 过度简化,“以#something开头的东西” - 在之前处理编译器实际上“看到”代码。 (它们仍然是语言标准的一部分,即与语言在同一篇论文中定义。)

只要你在有效代码中使用C预处理器结果做什么,编译器就会接受它。

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

至于“最佳做法”,#ifdef / #else / #endif不是最干净的设计,但有时它是解决平台细节的最快方法。与C / C ++中的所有内容一样(如可怕的宏),只要你不过度就可以了。把它放在一些中心位置(而不是让它遍布你的代码库),然后记录它,以便跟在你后面的人可以理解你的#ifdef,并且可能用更好的代替它们溶液

答案 1 :(得分:2)

  1. 以下预处理程序指令

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

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

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

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