【问题标题】:Predefined macros and C++11预定义宏和 C++11
【发布时间】:2015-11-08 13:57:57
【问题描述】:

据我所知,预定义的宏和操作(如#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
    }
    

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

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

【问题讨论】:

  • 我无法格式化代码,有人可以帮帮我吗?
  • 至少缩进 4 个空格,并且在代码和非代码之间至少有一个空行,以便格式化代码。
  • @MicroVirus,@πάντα ῥεῖ 谢谢
  • 预处理器是语言的一部分,在 C++ 规范中指定。
  • @MicroVirus 编号列表项有点不同,需要另外四个空格。

标签: c++ c++11 macros


【解决方案1】:

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

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

只要您对 C 预处理器所做的任何操作结果都是有效代码,编译器就会接受它。

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


至于“最佳实践”,#ifdef / #else / #endif 不是最简洁的设计,但有时它是解决平台细节问题的最快方法。与 C/C++ 中的所有内容(如可怕的宏)一样,只要不过度使用就可以。将其放在某个中心位置(而不是将其散布在您的代码库中),并将其记录下来,以便追随您的人能够理解您的#ifdef,并可能用更好的解决方案替换它们。

【讨论】:

  • 谢谢,我知道编译器看到什么是活动的(即使在非活动部分也看不到错误。但是,其他程序员会看到它们。因此,我在询问最佳实践看到我的代码的所有其他程序都会对它感到满意
【解决方案2】:
  1. 以下预处理指令

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

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

    #pragma 指令就像一个例外,因为它可以被编译器或其他外部东西解释。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 2011-03-30
    • 1970-01-01
    • 2010-10-17
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多