C++ 预处理器命令中的sizeof不';t编译时出现错误C1017
我想使用预处理器命令来控制代码执行路径。因为这样可以节省运行时间C++ 预处理器命令中的sizeof不';t编译时出现错误C1017,c++,preprocessor-directive,C++,Preprocessor Directive,我想使用预处理器命令来控制代码执行路径。因为这样可以节省运行时间 #如果(sizeof(T)==1未完成,则出现错误:C1017 template<typename T> class String { public: static void showSize() { #if (sizeof(T)==1) cout << "char\n"; #else cout <
#如果(sizeof(T)==1
未完成,则出现错误:C1017
template<typename T>
class String
{
public:
static void showSize()
{
#if (sizeof(T)==1)
cout << "char\n";
#else
cout << "wchar_t\n";
#endif
}
};
inline void test()
{
String<char>::showSize();
String<wchar_t>::showSize();
}
模板
类字符串
{
公众:
静态void showSize()
{
#if(sizeof(T)==1)
CUT> P> C和C++预处理器主要是一个荣耀的(不是很光荣的)文本替换引擎,它不真正理解C或C++代码。它不知道代码> < /C> >,它不知道C或C++类型。(它肯定不知道你的模板类中的<代码> t>代码>是什么。)
<>如果你想在t>代码>和 SeZOOS上做条件,那么你需要编写C++代码来完成它(即,<代码> if……>代码>代替<代码>……如果……/p> > p>预处理器在C++编译器之前运行。它不知道C++类型;只有预处理器令牌。
虽然我希望任何一个好的编译器都能优化掉一个if(sizeof(T)==1)
,但您可以在C++17中使用新的if constexpr
:
template<typename T>
class String
{
public:
static void showSize()
{
if constexpr (sizeof(T) == 1) {
std::cout << "char\n";
} else {
std::cout << "wchar_t\n";
}
}
};
模板
类字符串
{
公众:
静态void showSize()
{
如果constexpr(sizeof(T)==1){
std::cout正如@some程序员在评论中提到的,sizeof
不是预处理器的一部分
如果希望它在编译时工作,那么应该使用if-constexpr
如果您不关心它是在编译时还是在运行时发生,只需使用常规的if
station
<>记住,如果C++中的新特性是“代码”> CysPr> < /P> < P> BTW Borland C++和WATCOM C++支持sisiffes()在预处理器表达式中,我不知道GCC是否支持它。SigeOS/<代码>是C++中的编译时构造,它仍然不是预处理器的一部分。如果您需要编译时间检查,请使用<代码> > CONTXEPR(SIZEOF(t)=1)。
。我不认为我们可以说服你做出正式的回答,是吗?@user4581301,事实上,你可以。我希望使用或不使用constexpr
生成相同的代码。编译器可以处理if(1)
或if(0)
并且不发出运行时选择,这将导致完全不同的结果。\if
发生在编译时if()
发生在运行时,您应该使用if constepr(sizeof)在编译时工作。记住,如果 > CONTISPR,如果是C++中的一个新特性17@EnoshCohen编译器可能会对其进行优化,但最好还是提到constexpr
。
template <typename T, size_t = sizeof(T)>
struct size_shower
{
static void showSize()
{
std::cout << "wchar_t\n";
}
};
template <typename T>
struct size_shower<T, 1>
{
static void showSize()
{
std::cout << "char\n";
}
};
template<typename T>
class String
{
public:
static void showSize()
{
size_shower<T>::showSize();
}
};