c - 这段代码里有UB吗?

标签 c directive

这是代码:

#include <stdio.h>
#define f(x,y) \x##y

int main(int argc, char* argv[])
{

    return 0;
}
f(,)

我的 friend 问了我这个问题,但我没有明确的答案。

最佳答案

反斜杠是一个有效的预处理器标记(“每个不能是上述字符之一的非空白字符”),但它不能转换为任何有效标记(它不在 punctuator< 列表中s)。除了在行尾使用之外,反斜杠在字符和字符串文字之外的 C 程序中没有任何特殊意义。

因此,宏替换将不符合 §6.4.1 第 2 段中的要求:

Each preprocessing token that is converted to a token shall have the lexical form of a keyword, an identifier, a constant, a string literal, or a punctuator.

所以程序的格式不正确。如果生成了可执行文件,尝试执行它将会出现未定义的行为。

如果没有反斜杠,程序将是格式良好的。两个空宏参数的标记串联是明确定义的;它被替换为空。

关于c - 这段代码里有UB吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41863528/

相关文章:

c - 如何以编程方式远程登录并通过TCP套接字发出命令?

jquery - 使用 jQuery 设置输入值后更新 Angular 模型

javascript - 如何从创建许多选择标签的指令中将项目列表添加到 Controller 范围

javascript - $timeout 仍然是等待 Angular 指令模板的最佳实践吗?

c - fgets(stdin) 旁边的 feof(stdin) 何时返回 true?

c - 扩展 makefile 以使用 doxygen 生成库和文档

angularjs - 延迟 Angular 指令

jquery - 如何在 Angular 指令内定位动态生成的 id {{element}}

c - Getchar 不会停止比较

c - C中的帕斯卡三角形