使用/解决模板时停止编译
Stop compilation when a template has been used/resolved
这个mcve:
#include <stdio.h>
#include <time.h>
#define MAX_LENGTH_DATETIME 25
template <typename T>
char * convertUnixTimeToChar( time_t unixTime, T )
{
(void) unixTime;
#pragma message "2nd parameter in convertUnixTimeToChar() must be of type <char [MAX_LENGTH_DATETIME]>."
exit(1);
};
template<size_t N>
char * convertUnixTimeToChar( time_t unixTime, char (&destination) [N] )
{
if ( N < MAX_LENGTH_DATETIME )
{
printf( "Overflow in convertUnixTimeToChar(): destination size [%ld] must be at least [%u]", N, MAX_LENGTH_DATETIME );
exit(1);
}
struct tm * tmNow;
tmNow = localtime( &unixTime );
strftime( destination, MAX_LENGTH_DATETIME - 1, "%Y-%m-%d %H:%M:%S", tmNow );
return destination;
};
int main()
{
char buffer [MAX_LENGTH_DATETIME ];
printf( "Converted unix time=%sn", convertUnixTimeToChar( 1487585045, buffer ) );
}
我的问题:
我想从 gcc中显示消息#pragma message "2nd parameter in convertUnixTimeToChar() must be of type <char [MAX_LENGTH_DATETIME]>."
,而仅在 char *
的变量已传递给convertUnixTimeToChar()
时,汇编才能显示。现在我总是收到此消息。
换句话说,如果传递错误的参数,而不是程序运行时,则该汇编应失败[在这种情况下,我必须使用printf
而不是#pragma
才能获得通知]。
传递诸如char [25]
之类的东西可以解决第二模板,一切都很好!
如果使用模板已使用,我可以通过有条件地停止使用错误消息的汇编?
使用这些开关使用GCC 4.9.4编译:-Wall -Werror -Wextra -std=c++11 -O3
再次,最佳解决方案是"完全不要做任何事情"。
完全删除全部超负荷将使编译器为任何无法匹配char (&destination) [N]
的参数产生错误。
如果您想幻想并添加自己的错误消息,则可以在catch-all内使用依赖的 static_assert
:
template <class..., class T>
constexpr T &&depend(T &&o) {
return std::forward<T>(o);
}
template <typename T>
char *convertUnixTimeToChar( time_t, T&& )
{
static_assert(depend<T>(false), "2nd parameter in convertUnixTimeToChar() must ...");
}
并不是说这可能不是更好的解决方案,因为您将整个过载设置为convertUnixTimeToChar
并将其沉入硬错误,Sfinae会被诅咒。如果某人想为自己的类型添加过载,他们将必须确保比这种爆炸性的全部匹配更好,这比获得者更痛苦。
相关文章:
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 在Linux/Ubuntu中编译openCV应用程序时,如何解决未定义的引用cv:..?
- 如何解决我在 Ubuntu 19.04 下使用 GLFW 时遇到的这个编译问题?
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- 正在尝试解决特定于gcc的编译错误
- 为什么包含任意 STL 标头可以解决这些编译错误?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- C++编译错误LNK2019:未解决的外部符号错误
- 如何解决RUN_ERROR即使它正常编译
- 当 pkg-config 不能解决 opencv 'undefined reference'编译问题时,如何解决它?
- 编译示例 Cinder 项目时存在大量未解决的外部问题
- 解决此C 代码的编译错误
- 使用/解决模板时停止编译
- 编译轨道样品时的C 错误-LNK2019未解决的外部符号
- 尝试解决"out of scope"编译错误:CodeBlocks,Linux Fedora
- 窄转换编译警告.如何解决它
- 格式化如何解决操作数编译错误关于c++操作数ATR的
- 在CentOS 7 x64上编译QT时,如何解决矛盾的库问题
- 无法在调试模式下编译解决方案,因为缺少MSVCR100D.dll