`
lovnet
  • 浏览: 6876459 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

诡异的C++ #define编译错误

阅读更多

前几天写代码的时候遇到了一个十分诡异的编译错误。对于下面的代码,你能够发现问题在那里吗?

   1: #define test(a, b, c) \
   2:         a;            \ 
   3:         if (b)        \
   4:             c

编译器给出了下面这个错误信息:

testdefine.cpp(8) : error C2059: syntax error : 'if'

意思是if语法错误。显然这个不是真正原因。实际错误的原因其实很简单,在if的上一行的\那里多了一个空格,现在我把整个代码选择上,就比较容易看得出来问题了:

image

去掉多余的空格,再次编译,通过。

其实对于C/C++的预处理器而言,很容易就可以过滤掉\后面多余的空格,而没有必要由此引发语法错误。就算是要引发语法错误,也必须得有一个合理清晰的错误信息,不然只会浪费用户的时间。

分享到:
评论

相关推荐

    #indef 与#define 区别于用法

    如果没有采取适当的措施,就会导致重复定义的问题,这可能导致编译错误或者运行时错误。为了避免这种情况,可以采用 `#ifndef` 和 `#define` 结合的方式来防止头文件被重复包含。 示例: ```c #ifndef STDIO_H_ //...

    #ifndef #define #endif的用法

    但是,如果一个头文件被多次包含,可能会导致编译错误或警告,特别是当头文件中包含全局变量定义时。 为了避免这类问题,通常会在头文件中使用 `#ifndef`, `#define`, `#endif` 来防止头文件被多次包含。这种方式被...

    #define——用法大全

    关于 #define 指令的用法大全 #define 指令是 C 语言中的一种预处理指令,用于给常量赋予一个有意义的名称。在本文中,我们将详细介绍 #define ...但是,我们需要注意 define 的一些缺陷和限制,以免引起错误和问题。

    宏(#define)定义函数妙用

    例如,`SUM(a + b, c + d)` 使用宏 `#define SUM(x, y) x + y` 会被错误地展开为 `a + b + c + d`,而不是 `(a + b) + (c + d)`。为了避免这种情况,通常需要在宏定义中加入额外的括号。 此外,宏定义不支持重载,...

    #define用法集锦.doc

    在C/C++编程中,`#define`预处理器指令扮演着重要的角色,它可以用来定义常量、创建类似函数的功能以及实现条件编译等。下面我们将深入探讨`#define`的各种用法。 1. **简单的#define定义** `#define`常用于创建...

    预编译#define_#ifdef_#endif用法

    这样的做法能够避免由于多次`#include`同一头文件导致的编译错误或性能下降。同时,`#ifdef`和`#ifndef`也可以用来区分不同环境或配置的代码,例如针对不同的操作系统或硬件平台编写特定的代码段。 条件编译指令在...

    #define 宏定义的一些用法总结

    在C及C++编程中,`#define`是一个非常强大的预处理器指令,用于创建宏。宏可以在编译前阶段替代代码片段,提高代码的复用性与可维护性。本文将详细探讨`#define`的各种使用场景及其背后的原理。 #### 二、基本结构 ...

    C语言中const与#define的区别

    此外,由于#define宏是文本替换,因此在使用时,宏定义的参数需要用括号括起来,以避免在替换时发生优先级错误,且在宏定义内部不应进行运算。 在区分const和#define时,还有一些重要的细节需要注意。例如,在编译...

    常用宏定义#define

    在C/C++编程语言中,`#define` 是预处理器指令,用于创建宏定义,它在编译阶段执行文本替换,使得代码更加灵活且可定制化。宏定义是C/C++编程中的一个重要概念,它可以帮助程序员实现代码复用、简化复杂表达式、提供...

    typedef和#define的用法与区别

    在C/C++语言中,typedef是一种语言编译过程中的一部分,它常用来定义一个标识符及关键字的别名。它并不实际分配内存空间,实例像:typedef int INT;typedef int ARRAY[10];typedef (int*) pINT;typedef可以增强程序...

    define使用

    在大型项目中,为了避免头文件被重复包含导致的编译错误,通常会在头文件中使用 `#define` 来实现所谓的“头文件保护”。例如: ```c #ifndef __headerfileXXX__ #define __headerfileXXX__ // 头文件内容 #endif...

    头文件加#ifndef #define #endif.pdf

    这样,`a.h`就被重复包含了两次,这可能会导致编译错误,例如: ```none error C2084: function 'bool __cdecl Fa()' already has a body ``` 这种错误是因为编译器在处理多个包含时,试图为相同的函数定义生成多...

    C++ define介绍及使用

    在C++编程语言中,`#define`是一个预处理器指令,用于定义宏,它在编译阶段执行文本替换。宏定义允许程序员创建符号常量、条件编译指令和其他功能,以提高代码的可读性和可维护性。然而,尽管`#define`在早期的C++和...

    c++ 尽量不要使用#define 而是用const、enum、inline替换。

    例如:这里程序文件开头有如下#define语句 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 … … 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛...

    c++编译错误对照表.docx

    C++ 编译错误对照表 C++ 编译错误是指在编译 C++ 代码时出现的错误信息,以下是常见的编译错误信息对照表: 1. fatal error C1003: error count exceeds number; stopping compilation 中文对照:(编译错误)...

    #define宏定义——只替换,不计算! #define VS typedef

    例如,`#define PI 3.1415926`,如果误写为`g`,预处理器仍会替换,导致编译错误。 2. `typedef`是在编译阶段执行的,它用于给已存在的类型创建别名,如`typedef int Integer;`。`Integer`现在是`int`的同义词,类型...

    VC++6.0常见错误提示

    - **中文对照**:(编译错误)#define语法错误 - **分析**:这种错误通常发生在`#define`宏定义时,宏定义的基本格式是`#define 宏名 替换串`,常见的错误包括: - `#define`后面缺少宏名。 - 宏定义的替换串不...

    c++条件编译详解

    ### C++条件编译详解 #### 一、条件编译概述 条件编译是一种在编译阶段根据不同的条件选择性地编译代码片段的技术。它主要用于优化编译过程,提高程序运行效率,以及针对不同环境定制编译结果。C++中的条件编译...

    C++中const与#define的利弊分析

    在C++编程语言中,`const`和`#define`都是用来定义常量或不可变值的工具,但它们在实现方式、作用范围、类型安全和功能上有着显著的差异。 首先,`#define`是一种预处理器指令,它在编译前会进行文本替换。这意味着...

    c++常见编译错误.doc

    "C++常见编译错误" C++编程中,常见的编译错误主要集中在指针及内存申请、释放和数组超界等几个方面。本文将对这些常见错误进行总结和分析,以供参考。 一、指针及内存申请、释放 在C++编程中,指针是一个非常...

Global site tag (gtag.js) - Google Analytics