8
|
Francisco Ryan Tolmasky I · 技术社区 · 10 年前 |
![]() |
1
10
宏没有真正“正确”扩展,因为这不是一个有效的C预处理器程序。正如Kerrek所说,预处理器没有 相当地 处理任意字符序列-它处理整个令牌。令牌是标点符号、标识符、数字、字符串等,其形式(或多或少)与构成有效C代码的形式相同。这些定义没有描述有效的字符串,它们会打开字符串,但在行尾之前无法关闭字符串。因此,一个无效的令牌序列被传递给预处理器。事实上,它能够从一个无效的程序中产生输出,这一点可以说是很方便的,但这并不能使其正确,而且几乎可以肯定,它最多只能保证预处理器的垃圾输出。您需要终止字符串,以便它们形成完整的令牌-现在它们形成垃圾输入。
要在引号中实际包装标记或标记序列,请使用字符串化运算符
GCC和类似的编译器会在编译时警告您类似的错误
或
使用
(我假设您只在尝试以C编译时出错,但在两次编译时不会出错,因为在编译器内部,它保留了这些是“坏”标记的信息,如果您写出一个中间文件,然后在第二次编译中编译预处理的源代码,则会丢失这些信息……如果是,这是一个实现细节,不要依赖它。) 实际问题的一个可能解决方案如下:
这个
|
![]() |
Imad Hamaidi · 如何使预处理器宏在编译之前对代码求值 2 年前 |
![]() |
Lightsout · 用于填充表的sql连接压缩行 2 年前 |
![]() |
Rogue258 · 在DB2SQL中使用存储过程/宏进行声明和循环 2 年前 |
![]() |
allthem · 将VBA设置为仅在第一次打开电子表格时自动运行 2 年前 |
![]() |
user306080 · 下面的宏在做什么? 2 年前 |
![]() |
Xev · 运行时错误91:对象变量或未设置块 2 年前 |
![]() |
digital illusion · 请参阅宏扩展中的外部板条箱 2 年前 |
![]() |
Aleph · 标识符在C预处理器指令中的作用是什么 2 年前 |
![]() |
Gakuo · 使用lisp循环宏进行高级循环 6 年前 |