Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 预处理器命令中的sizeof不';t编译时出现错误C1017_C++_Preprocessor Directive - Fatal编程技术网

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();
    }
};