C 语言 - 宏 - 宏定义的普通方式与 do-while(0) 方式(基本使用、分号影响、在控制语句中的安全性)

发布于:2025-07-02 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、宏定义的简单方式

1、基本使用
#include <stdio.h>

#define PRINT_WELCOME() printf("Hello, welcome!\n");

int main() {

    PRINT_WELCOME();

    return 0;
}
  • 输出结果
Hello, welcome!
2、分号的影响
  1. 宏定义时有分号,调用时也加分号,就会多一个空语句
// 宏定义时有分号

#define PRINT_WELCOME() printf("Hello, welcome!\n");
// 调用时也加分号

PRINT_WELCOME();

// 即 printf("Hello, welcome!\n"); ;
  1. 宏定义时有分号,调用时可以不加分号,但这会导致代码风格不一致,不推荐这样做
// 宏定义时有分号

#define PRINT_WELCOME() printf("Hello, welcome!\n")
// 调用时可以不加分号

PRINT_WELCOME()

// 即 printf("Hello, welcome!\n");
  1. 宏定义时没有分号,调用时必须加分号
// 宏定义时没有分号

#define PRINT_WELCOME() printf("Hello, welcome!\n")
// 调用时必须加分号

PRINT_WELCOME();

// 即 printf("Hello, welcome!\n");
  1. 宏定义时没有分号,调用时不加分号,会导致编译错误
#include <stdio.h>

#define PRINT_WELCOME() printf("Hello, welcome!\n")

int main() {

    PRINT_WELCOME()

    return 0;
}
# 输出结果

E0065	应输入“;”		
C2143	语法错误: 缺少“;”(在“return”的前面)
3、在控制语句中可能导致编译错误
  • 例如,省略括号的 if-else 语句,它只能控制紧随的一条语句,如果宏展开后变成多条语句,就会导致编译错误
  1. 宏定义时有分号,调用时也加分号,宏展开后变成多条语句,会导致编译错误
#include <stdio.h>

#define PRINT_WELCOME() printf("Hello, welcome!\n");

int main() {

    if (1)
		PRINT_WELCOME(); // 展开宏后为 printf("Hello, welcome!\n"); ;
    else
        printf("do else\n");

    return 0;
}
# 输出结果

E0127	应输入一个语句
C2181	没有匹配 if 的非法 else
  1. 宏定义时有分号,调用时不加分号,宏展开后变成一条语句,不会导致编译错误,但这会导致代码风格不一致,不推荐这样做
// 宏定义时有分号

#define PRINT_WELCOME() printf("Hello, welcome!\n");
if (1)
    PRINT_WELCOME() // 展开宏后为 printf("Hello, welcome!\n");
else
    printf("do else\n");
  1. 多条语句宏,宏展开后变成多条语句,会导致编译错误
#include <stdio.h>

#define PRINT_WELCOME() printf("Hello, welcome 1\n"); printf("Hello, welcome 1\n")

int main() {

    if (1)
		PRINT_WELCOME(); // 展开宏后为 printf("Hello, welcome 1\n"); printf("Hello, welcome 1\n");
    else
        printf("do else\n");

    return 0;
}
# 输出结果

E0127	应输入一个语句
C2181	没有匹配 if 的非法 else

二、宏定义的 do-while(0) 方式

1、基本使用
#include <stdio.h>

#define PRINT_WELCOME() do { printf("Hello, welcome!\n"); } while(0)

int main() {

    PRINT_WELCOME();
    
    return 0;
}
# 输出结果

Hello, welcome!\n
2、关于分号
  • 宏定义时没有分号,使用时,会强制要求加分号,更像普通函数调用,代码风格保持一致
// 宏定义时没有分号

#define PRINT_WELCOME() do { printf("Hello, welcome!\n"); } while(0)
// 使用时,会强制要求加分号

PRINT_WELCOME();

// 即 do { printf("Hello, welcome!\n"); } while(0);
3、在控制语句中安全使用
  • 由于 do-while(0) 方式可以将多条语句组合成一个逻辑块, 例如,在省略括号的 if-else 语句,可以安全使用
  1. 一条语句
#include <stdio.h>

#define PRINT_WELCOME() do { printf("Hello, welcome!\n"); } while(0)

int main() {

    if (1)
        PRINT_WELCOME();
    else
        printf("do else\n");

    return 0;
}
# 输出结果

Hello, welcome!
  1. 多条语句
#include <stdio.h>

#define PRINT_WELCOME() do { printf("Hello, welcome 1\n"); printf("Hello, welcome 2\n"); } while(0)

int main() {

    if (1)
        PRINT_WELCOME();
    else
        printf("do else\n");

    return 0;
}
# 输出结果

Hello, welcome 1
Hello, welcome 2

网站公告

今日签到

点亮在社区的每一天
去签到