在编译时打印类型名称而不会中止编译?

问题描述 投票:5回答:1

此问题:

Print template typename at compile time

关于如何在编译时获取典型的C ++编译器以打印类型名称的建议。但是,它们依赖于触发编译错误。

我的问题:我可以让C ++编译器打印类型的名称不带停止编译吗?

通常,答案是“可能不会”,因为可以将有效程序编译到其目标对象中,而无需在任何地方打印任何内容,因此,我要特别问一下GCC和clang,并可能使用预处理器指令,编译器内置函数或任何特定于编译器的技巧。

注意:

  • 显然,挑战在于在using/typedef语句,模板参数值,可变参数模板等后面打印类型。如果该类型明确可用,则可以只使用#message "my type is unsigned long long"之类的东西。
  • 依赖于C ++ 11或更早版本的答案优于要求C ++ 14/17/20。
c++ g++ clang++ compile-time debug-print
1个回答
3
投票

您可以使用#pragma message <message_string>。 GCC和CLANG都支持它。

从GCC docs

GCC还提供了一种简单的机制,可以在编译。

#pragma message "string"

在编译时将字符串作为编译器消息打印。消息是仅供参考,既不是编译警告也不是错误。可以使用'\ n'转义符将换行符包含在字符串中顺序。

以及来自CLANG docs

除了控制警告和错误编译器,可以生成自定义警告和错误消息通过以下实用程序:

// The following will produce warning messages
#pragma message "some diagnostic message"
#pragma GCC warning "TODO: replace deprecated feature" ```

// The following will produce an error message
#pragma GCC error "Not supported"
© www.soinside.com 2019 - 2024. All rights reserved.