gpt4 book ai didi

c++ - 预定义宏和 C++11

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:04 25 4
gpt4 key购买 nike

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

我的问题是:

  1. 以上是真的吗?完全正确?和异常(exception)情况?
  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
    }

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

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

最佳答案

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

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

只要您对 C 预处理器执行的任何操作产生有效代码,编译器就会接受它。

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


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

关于c++ - 预定义宏和 C++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33594742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com