【问题标题】:What does `(void)varName;` do? [duplicate]`(void)varName;` 有什么作用? [复制]
【发布时间】:2012-12-12 23:45:19
【问题描述】:

可能重复:
casting unused return values to void
C++ What is the purpose of casting to void?

在使用 CMake 下载并构建 GDCM 代码后,我偶然发现了这个:

void error_callback(const char *msg, void *) {
    (void)msg;
    gdcmErrorMacro( "Error in gdcmopenjpeg" << msg );
}

第一行是做什么的?从来没有见过这样的事情。请记住,我告诉 CMake 使用 Visual Studio 2010 进行构建,如果这很重要的话。

【问题讨论】:

  • 请在标题中更具体。

标签: c++ syntax


【解决方案1】:

该函数未使用参数msg,编译器将抱怨(警告)未使用的参数。

(void)msg; 行只是“使用”该参数(没有效果)。这样,编译器就不会产生警告。

编辑:实际上,该函数使用该参数,但可以将宏 gdcmErrorMacro 设置为(通过编译定义的宏)以扩展为...什么都没有(例如,扩展为空的 do{}while(0); 构造,如习惯于在 Linux 内核中。

这样,编译器将在使用参数msg 的函数体中看不到任何内容(请记住,编译器看到的是预处理源文件,因此宏已经展开)。

这样的话,经过预处理后,编译器会看到:

void error_callback(const char *msg, void *) {
    (void)msg;
    do{ }while(0);
}

参数msg 的唯一“用途”是(void)msg; 这一行。

【讨论】:

    【解决方案2】:

    这可以防止在函数中未使用函数的形式参数时发出编译器警告。

    在编译生产代码时将警告视为错误通常是一个好主意,因此这看起来像是在宏使用中提到 msg 之前尝试清除它。

    这也可以通过简单地不首先命名形式参数来解决——事实上,如果在使用宏时没有提到msg,我会这样做 IRL:

    void error_callback(const char *, void *) {
    }
    

    【讨论】:

    • 但是当宏需要msg时,这不会编译失败吗?
    • 但是如果宏被定义为对它做一些事情,你需要命名参数以便在宏参数中使用它。
    • @MikeSeymour & dario_ramos:对。已编辑。
    【解决方案3】:

    它可以防止 未使用的变量 警告。据推测,宏 gdcmErrorMacro() 可以是 #defined 作为空宏,并且在这种情况下不会引用 msg

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 2014-10-25
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多