我想获得无参数:map调用的输出,以便我可以使用vim的搜索功能来查找映射.
我找到了:redir,它将ex命令的输出重定向到变量,寄存器或文件中,但它似乎不适用于map,它必须以某种不同的方式输出映射,例如:echo 'hello world'.
我如何正则表达式转义动态输入的字符串.我想用实际的正则表达式代码包围然后做匹配,但我需要输入转义中的所有正则表达式特殊字符.
是否可以编写一个解析字符串文字参数的gcc宏?我知道相反的可能性#.可以逆转吗?
例如,__func__ 以字符串文字的形式计算当前函数的名称.我可以删除它周围的双引号吗?
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
提到
for ( declaration expression opt ; expression opt ) statement
Run Code Online (Sandbox Code Playgroud)
在6.8.5下的迭代语句.
这是一个错字或不C11有两个表达式,在最括号的循环?
假设我有一个具有两个成员a且b具有相同类型的联合u (例如,int).
union u{
int a,b;
char c;
};
Run Code Online (Sandbox Code Playgroud)
如果我写入a,通过值传递给函数,并且函数读取b,期望获得a值,是否会有任何问题,考虑a并b具有相同的类型?成员读取是否需要镜像成员写入?
如果复合文字出现在函数体外,则该对象具有静态存储持续时间; 否则,它具有与封闭块相关的自动存储持续时间.
我是否正确将"封闭块"解释为"最里面的封闭块"?(因为如果它不是最里面的那个,那是什么?) 为什么gcc和clang表现得好像文字的生命周期是它的封闭函数?
例:
long foo(long*);
void call_foo()
{
{foo(&(long){42});}
{foo(&(long){42});}
{foo(&(long){42});}
{foo(&(long){42});}
}
//for comparison
void call_foo2()
{
{long x=42;foo(&x);}
{long x=42;foo(&x);}
{long x=42;foo(&x);}
{long x=42;foo(&x);}
}
Run Code Online (Sandbox Code Playgroud)
gcc/clang在-O3生成的代码:
call_foo:
sub rsp, 40
mov rdi, rsp
mov QWORD PTR [rsp], 42
call foo
lea rdi, [rsp+8]
mov QWORD PTR [rsp+8], 42
call foo
lea rdi, [rsp+16]
mov QWORD PTR [rsp+16], 42
call foo
lea rdi, [rsp+24]
mov QWORD PTR [rsp+24], 42
call foo
add rsp, 40
ret …Run Code Online (Sandbox Code Playgroud) 我有一个非常常用的,有点复杂的宏(MAC(...)为了这个问题,我们称之为),它必须是一个宏(因为它是非常通用的类型)。该宏在语法上表现得像函数调用,但在内部调用了 10 多个其他宏。
因此,如果我在调用时出错,MAC()例如,如果我这样做:MAC(1-)gcc/clang 将向我转储我根本不
感兴趣的相当长的预处理器堆栈跟踪MAC()。
如果我像这样定义 MAC():
#if DEBUG_MAC
int MAC(); //so I get a nice preprocessor stack trace
#else
#define MAC(...) //here would come the actual definition
#endif
Run Code Online (Sandbox Code Playgroud)
然后,在遇到我用 重新编译的错误时-DDEBUG_MAC,我得到了一个很好的(=不存在的)预处理器堆栈跟踪,但这种方法感觉很笨拙,只能用于诊断硬错误,而不是警告。
有没有办法让 gcc 或 clang 表现得像这样,即,为了错误报告的目的,将宏视为不透明的函数调用,而不进行这种声明/宏改组?
什么时候真正需要这些宏?
我的系统 (gcc/glibc/linux/x86_64)stdint.h使用__这些( -prefixed) 变体来定义:
# define INT64_MIN (-__INT64_C(9223372036854775807)-1)
# define INT64_MAX (__INT64_C(9223372036854775807))
# define UINT64_MAX (__UINT64_C(18446744073709551615))
# define INT_LEAST64_MIN (-__INT64_C(9223372036854775807)-1)
# define INT_LEAST64_MAX (__INT64_C(9223372036854775807))
# define UINT_LEAST64_MAX (__UINT64_C(18446744073709551615))
# define INT_FAST64_MIN (-__INT64_C(9223372036854775807)-1)
# define INT_FAST64_MAX (__INT64_C(9223372036854775807))
# define UINT_FAST64_MAX (__UINT64_C(18446744073709551615))
# define INTMAX_MIN (-__INT64_C(9223372036854775807)-1)
# define INTMAX_MAX (__INT64_C(9223372036854775807))
# define UINTMAX_MAX (__UINT64_C(18446744073709551615))
Run Code Online (Sandbox Code Playgroud)
然而,limits.h它似乎与:
# define LONG_MAX 9223372036854775807L
# define ULONG_MAX 18446744073709551615UL
Run Code Online (Sandbox Code Playgroud)
为什么不能stdint.h忘记_C宏并简单地做:
# define INT_LEAST64_MAX 9223372036854775807 //let it grow …Run Code Online (Sandbox Code Playgroud) 因此,我与我的教授较早地争论过,认为NULL不是指针,但他坚持认为这是因为存在诸如NULL指针之类的东西。所以,现在我有点困惑,如果NULL确实是一个指针
我已经尝试过在互联网上搜索,但找不到任何答案,所以我的最后选择是在这里
我很好奇我能否编译
int map [] = { [ /*(unsigned char)*/ 'a' ]=1 };
Run Code Online (Sandbox Code Playgroud)
不论平台如何,还是unsigned char在使用字符常量作为索引之前将其转换为更好。