c,if语句不能正常工作

时间:2018-04-13 22:21:14

标签: c if-statement macros

我做了这个简单的程序但我的if语句不能正常工作。 这是我的代码:

 try {
        JSONObject postData = new JSONObject(response);

        postData.put("deviceID", unique_id);
        postData.put("depth",postData.get("depth").toString());
        //postData.put("xCord", locationObject.get("xCord").toString());
        postData.put("location", postData.get("location").toString());
        postData.put("yCord",locationObject.get("yCord").toString());
        postData.put("size", postData.getInt("size").toString());

        new SendData().execute("servername",postData.toString());

    } catch (JSONException e) {
        e.printStackTrace();
    }

}

好吧,我可以把s,i,c等于0或1,但if语句总是执行,我的LED在任何情况下都会打开。

如果我在if语句中删除了开启命令,则LED不会打开(这意味着没有其他功能会导致冲突强制LED变为高电平)。 如果我在关闭LED的if语句之后放了一个else,那么所有的LED都会关闭。听起来好像if和else语句不存在,并且LED上的最后一个命令是执行的。 是否可能存在忽略if语句的函数或宏或其他东西?

1 个答案:

答案 0 :(得分:4)

您的宏可能会扩展为多个语句,并且不会包含do .. while(0)

{}语句中使用if围绕宏。

if(s==1) {
    _CONFIG_DRIVE_PORT_OUTPUT_VALUE(...);
}
//...

如评论中所述,原始宏可被视为已损坏,应予以修复。

假设宏被定义为:

#define _CONFIG_DRIVE_PORT_OUTPUT_VALUE(ref, pins, value, chars) \
    GPIO##ref##_PIDR &= ~(pins);                                 \
    GPIO##ref##_PDOR = ((GPIO##ref##_PDOR & ~(pins)) | (value)); \
    GPIO##ref##_PDDR |= (pins);

应该改为:

#define _CONFIG_DRIVE_PORT_OUTPUT_VALUE(ref, pins, value, chars) \
    do {                                                         \
    GPIO##ref##_PIDR &= ~(pins);                                 \
    GPIO##ref##_PDOR = ((GPIO##ref##_PDOR & ~(pins)) | (value)); \
    GPIO##ref##_PDDR |= (pins);                                  \
    } while(0)

如果宏已修复,那么原始代码将无法修改。