(#ifdef)与(#define <boolean>)

时间:2019-11-20 10:10:29

标签: c preprocessor-directive

我正在尝试找出哪种实践是最好的:

const [fields, setFields] = useState([{ value: null }]);
    const [data, setData] = useState();

    function handleChange(e) {
        const values = [...fields];
        setData({
            ...data,
            [e.target.name]: e.target.value
        });
        setFields(values);
        console.log(data)
    }

    useEffect(() => {
        requestInputData().then((data) => {
            setFields(data["input"]);

        }).catch(error => {
            notification.error({
                message: APPLICATION_NAME,
                description: error.message || 'Sorry! Something went wrong. Please try again!'
            });
        });
    }, []
    )

    return (
        <div >

            {fields.map((field) => {
                return (
                    <div >

                        <input
                            type="text"
                            name={field}
                            placeholder={field}
                            onChange={e => handleChange(e)}
                        /> 
                        <br/>

                    </div>
                );
            })}
        </div>
    );
#define TEST 
//#define TEST commented if not used or simply deleted

出于可读性考虑,我更喜欢定义一个“布尔”并在#define TEST 1 #define TEST 0 //if not used 中对其进行检查,但是我猜它效率不高,因为它不使用if,并且每次都需要对其进行检查。如果

2 个答案:

答案 0 :(得分:5)

尽管您不能在第二种情况下使用#ifdef,但是您绝对可以使用#if,因此TEST 0不会有任何额外的运行时成本。也意味着您可以为TEST设置多个不同的值,也许对应于不同的日志级别或类似的东西

(如Bathsheba所建议,将我的评论发布为答案)

答案 1 :(得分:2)

许多月亮以前,有些编译器(如果我没记错的话,就是一个Solaris编译器)无法正确编译使用第一个代码段的代码。

但是C标准(现在)要求它们这样做,因此使用第二种方法(现在被视为特质)根本没有任何好处。

当然,如果您需要TEST是一个数值,例如在条件检查中,而不是仅使用#ifdef,那么您就需要使用第二种方法。