相关疑难解决方法(0)

如何在不违反 C++ 核心准则的情况下将整数转换为 void*?

这有效,但也会导致“不要使用reinterpret_cast(type.1)”警告:

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,
  reinterpret_cast<void*>(sizeof(GLfloat) * 3));
Run Code Online (Sandbox Code Playgroud)

这不能编译:

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,
  static_cast<void*>(sizeof(GLfloat) * 3));
Run Code Online (Sandbox Code Playgroud)

这不能编译:

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,
  dynamic_cast<void*>(sizeof(GLfloat) * 3));
Run Code Online (Sandbox Code Playgroud)

这显然是可行的,但在 C++ 中似乎是一个很大的禁忌(“不要使用 C 风格的强制转换 (type.4)”)

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,
  (void*)(sizeof(GLfloat) * 3));
Run Code Online (Sandbox Code Playgroud)

我应该忽略有关的警告reinterpret_cast吗?

c++ opengl

5
推荐指数
1
解决办法
1517
查看次数

Arduino 1.0.6:如何更改编译器标志?

我目前正在使用Arduino 1.0.6 IDE开发一个项目,它似乎不接受C++ 11 std :: array.是否可以更改编译器标志以使其工作?

arduino c++11 arduino-ide

4
推荐指数
4
解决办法
8944
查看次数

register_printf_specifier 的替代方法(使用 printf() 以二进制格式打印数字)

我知道 register_printf_specifier 现在已被弃用。

我无法再使用www.onlinegdb.com 上的 C99 编译器使用 register_printf_specifier 运行代码。

例如,我真的想运行以下代码,将 %B 格式说明符添加到 printf() 以便以二进制形式打印出整数(从是否有 printf 转换器以二进制格式打印?):

/*
 * File:   main.c
 * Author: Techplex.Engineer
 *
 * Created on February 14, 2012, 9:16 PM
 */

#include <stdio.h>
#include <stdlib.h>
#include <printf.h>
#include <math.h>
#include <string.h>
#include <stdarg.h>

static int printf_arginfo_M(const struct printf_info *info, size_t n, int *argtypes)
{
    /* "%M" always takes one argument, a pointer to uint8_t[6]. */
    if (n > 0) {
        argtypes[0] = PA_POINTER;
   } …
Run Code Online (Sandbox Code Playgroud)

c printf glibc

4
推荐指数
1
解决办法
103
查看次数

如何修复 gcc 警告“友元声明声明非模板函数”

所以我这里有一些使用 gcc、clang 和 msvc 编译的代码:

#include <cstdio>
#include <type_traits>

struct c_class;

template <class T> struct holder { friend auto adl_lookup(holder<T>); };

template <class C, class T> struct lookup {
  friend auto adl_lookup(holder<T>) { return holder<C>{}; }
};

struct cpp_class : lookup<cpp_class, c_class *> {
  cpp_class() {}
};

int main() {
  static_assert(std::is_same<holder<cpp_class>,
                             decltype(adl_lookup(holder<c_class *>{}))>{},
                "Failed");
}
Run Code Online (Sandbox Code Playgroud)

之所以在类adl_lookup中定义lookup而不是在类中定义,是为了在继承CRTP类时holder可以从c_class到进行“反向”查找。所以友元函数不能移到类中。cpp_classlookup<cpp_class, c_class *>holder

但是,在 gcc 上,我收到有关非模板友元函数的警告:

<source>:9:37: warning: friend declaration 'auto adl_lookup(holder<T>)' declares a …
Run Code Online (Sandbox Code Playgroud)

c++ templates gcc-warning language-lawyer c++14

2
推荐指数
1
解决办法
874
查看次数

Eigen LinSpaced - 不推荐使用的复制警告

在我的项目中,编译器抱怨以下(以及许多其他类似的)代码片段:

    Eigen::ArrayXf window =
            Eigen::ArrayXf::LinSpaced(2*M + 1, 0, M_PI)
            .head(2*M)
            .sin();
Run Code Online (Sandbox Code Playgroud)

警告信息很长且无法阅读,所以我不会在这里发布所有内容。触发的警告是-Wdeprecated-copy,警告消息的核心部分(在我看来)如下

warning: implicitly-declared ‘Eigen::Block<const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >, -1, 1, false>::Block(const Eigen::Block<const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >, -1, 1, false>&)’ is deprecated [-Wdeprecated-copy]
note: because ‘Eigen::Block<const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >, -1, 1, false>’ has user-provided ‘Eigen::BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Eigen::Dense>& Eigen::BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Eigen::Dense>::operator=(const Eigen::BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Eigen::Dense>&) [with XprType = const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, …
Run Code Online (Sandbox Code Playgroud)

c++ eigen c++11

1
推荐指数
1
解决办法
1783
查看次数