我尝试使用串联预处理器操作符##来理解c中的宏,但我意识到我的令牌有问题.我认为这很容易,但实际上并非如此.
因此,串联用于连接两个令牌以创建新令牌.例如:连接(和)或int和*
我试过了
#define foo(x,y) x ## y
foo(x,y)
Run Code Online (Sandbox Code Playgroud)
每当我给它一些论据时,我总是会错误地说出来 pasting both argument does not give a valid preprocessor token.
例如,为什么连接foo(1,aa)结果1aa(哪种类型的令牌是它?以及它为什么有效)但foo(int,*)我得到了一个错误.
有没有办法知道哪些令牌是有效的,或者是否有可能有一些良好的联系,以了解如何在我的脑海中澄清它.(我已经谷歌搜索谷歌和SO)
我错过了什么?
我会很感激.
我对这四个术语感到困惑:
字符串文字
字符常量
字符串字面量.
多字节字符序列
并阅读C标准中的这句话:
字符串文字不必是字符串(见7.1.1),因为
\0转义序列可以在其中嵌入空字符.
第一部分是什么意思?
我想知道是否可以显示<tab> as | (bars) 像这样在 vim 中编码时
有什么方法可以展示它们。
请除set listcharsand之外的任何解决方案,set list因为它会影响 eol 和空格。
我不明白为什么会这样:
if(1)
{
int i;
}
Run Code Online (Sandbox Code Playgroud)
而这不是:
if(1)
int i;
Run Code Online (Sandbox Code Playgroud)
错误:int之前的预期表达式
如果你能提供一些标准参考.
这一行:
#define hash_hash # ## #
Run Code Online (Sandbox Code Playgroud)
将生成##但不是基于以下内容的未定义行为:
如果结果不是有效的预处理标记,则行为未定义.
编辑:
换句话说,扩展hash_hash会产生一个新的令牌,由两个相邻的尖锐符号组成,但这个新令牌不是##运算符.
预处理令牌的类别是:
预处理令牌分为五大类:标识符,预处理数字,字符串文字,标点符号和其他
如果没有UB,##新令牌是否属于其他类别.
注意:请花时间阅读问题和答案,甚至在低估之前.
从C11标准(草案):7.21.6.2/12:
如果输入项是在同一程序执行期间先前转换的值,则结果的指针应该等于该值; 否则%p转换的行为是未定义的.
有人可以为这部分标准提供代码吗.也无法理解%p从输入中获取的用法.
这是允许的吗?
goto inside;
{
inside:
int a[n];
}
Run Code Online (Sandbox Code Playgroud)
goto语句不应从具有可变修改类型的标识符范围之外跳转到该标识符的范围内.
反过来怎么样?
{
goto outside;
int a[n];
}
outside: ;
Run Code Online (Sandbox Code Playgroud)
和
{
int a[n];
goto outside;
}
outside: ;
Run Code Online (Sandbox Code Playgroud)
它们是一样的吗?