小编car*_*ama的帖子

如何为不同的 clang-format 版本维护 .clang-format 文件?

这个问题用不同的 clang 格式版本扩展了统一输出。问题是 clang-format 的默认行为因版本而异,即使对于内置样式也是如此。坦率地说,我想问一下为什么开发人员在这里不关心兼容性,但这无关紧要。情况就是这样,我必须处理它。我不允许需要某个版本的 clang-format(就像相关答案中建议的一位用户)并且需要配置 clang-format 以便它为不同版本提供相同的结果。如果可能,应涵盖 >= 4.0 的版本。如果这不可行,则可以接受适用于版本 >= minimum_version 的解决方案。

我想人们可以为每个 clang 格式版本找到一个配置,以提供所需的输出——繁琐的工作,但至少它是一个解决方案。但是对不同版本使用相同的 .clang 格式文件会产生一些问题,因为旧版本不知道新密钥。所以一个人需要

  • 如果键未知,则跳过键的 clang 格式开关
  • 一种将附加选项传递给 clang-format 的方法(除了文件中给出的选项)
  • 一种为给定的 clang 格式版本指定配置文件的方法
  • 执行上述操作之一的好方法(不确定此处提供什么 clang-format)

有任何想法吗?

compatibility coding-style clang-format

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

使用 clang 显式 C++ 模板实例化

注意:几个相关问题(例如,这个问题)最终被标记为该问题的重复项。我知道这个特定问题并遵循相应答案中的解决方案。然而,不同的编译器会产生不同的行为,我不知道为什么。

我的库具有一个类模板,我想为库中的某些模板参数提供实例,因为该模板需要一些重要的编译时间。类模板可能如下所示 ( stack.hpp)

#ifndef MY_STACK
#define MY_STACK

template<class T>
class stack
{
public:
    stack();
};

#endif
Run Code Online (Sandbox Code Playgroud)

其实现驻留在相应的stack.tpp文件中

#ifndef MY_STACK_TPP
#define MY_STACK_TPP

#include <iostream>

template<class T>
stack<T>::stack()
{
    std::cout << "My stack constructor!" << std::endl;
}

#endif
Run Code Online (Sandbox Code Playgroud)

由于我只想提供对某些模板参数的支持,因此我stack.cpp创建了以下显式模板实例:

#include "stack.hpp"

template class stack<double>;
template class stack<char>;

#include "stack.tpp"
Run Code Online (Sandbox Code Playgroud)

它使用 g++ 和 clang++ 进行编译,但生成的共享库的符号存在差异:

g++ -std=c++11 -c stack.cpp -o stack.so
nm -C stack.so | grep stack
0000000000000049 t _GLOBAL__sub_I_stack.cpp
0000000000000000 W …
Run Code Online (Sandbox Code Playgroud)

c++ linker templates explicit-instantiation

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