g ++和clang ++在启用优化时的奇怪行为

时间:2018-06-07 17:34:30

标签: c++ c++11 g++ clang++

这是我的计划:

print.hpp:

#pragma once

#include <iostream>

template<size_t p>
void print()
{
  std::cout << "" << __FILE__ << "" <<  __LINE__ << "" << std::endl;
  exit(0);
}

print.cpp:

#include "print.hpp"

template<>
void print<13>()
{
  std::cout << "Unlucky." << std::endl;
}

main.cpp中:

#include <iostream>
#include "print.hpp"

int main()
{
  std::cout << "Started." << std::endl;
  print<13>();
  std::cout << "Exiting." << std::endl;
}

当我使用g++ main.cpp print.cpp -O0 -std=c++11 && ./a.out编译时,它工作正常(输出为:

Started.
Unlucky.
Exiting.

)。 但是,如果我用g++ main.cpp print.cpp -O1 -std=c++11 && ./a.out编译它,它会给我输出的分段错误:

Started.
Unlucky.
Speicherzugriffsfehler //German for memory access error

与clang ++几乎相同,没有优化它就可以正常工作 并且使用-O1或更高版本输出:

Started.
Unlucky.
./print.hpp8

为什么?

1 个答案:

答案 0 :(得分:1)

您需要在.hpp文件中声明模板特化。

array([[  4. ,   0.8],
       [  7. ,   0.4],
       [  8. ,   1.2],
       [ 11. ,   1.5],
       [ 15. ,   0.1],
       [ 19. ,   0.5]])

如果没有.hpp文件中的声明,我会收到g ++ 6.4.0的链接器错误。

template<size_t p>
void print()
{
  std::cout << "" << __FILE__ << "" <<  __LINE__ << "" << std::endl;
  exit(0);
}

// Declare the specialization.
template<> void print<13>();

我不确定你如何在没有声明的情况下成功建立你的程序。