我在互联网上的某个地方找到了一个简单的解决方案,没有内置的C++ RTTI.
template <typename T>
class Identity {
public:
static int64_t id()
{
static int64_t dummy;
return reinterpret_cast<int64_t>(&dummy);
}
};
Run Code Online (Sandbox Code Playgroud)
当我们需要一些类ID时,我们只需使用:
Identity<OurClass>::id();
Run Code Online (Sandbox Code Playgroud)
我想知道,有没有碰撞?它可以为不同的类返回相同的ID,还是为相同的类返回不同的ID?我用g ++尝试了这个带有不同优化值的代码,一切似乎都没问题.
在Linux系统编程一书中,我读过这样的文章:
fgetc返回读取作为字符unsigned char强制转换为int或EOF在文件或错误的结束.使用的常见错误fgetc是:Run Code Online (Sandbox Code Playgroud)char c; if ((c = fgetc()) != EOF) {...}这段代码的正确版本是:
Run Code Online (Sandbox Code Playgroud)int c; if ((c = fgetc()) != EOF) { printf("%c", (char)c); ... }
那么,为什么我不能char在比较之前投出一个返回值EOF呢?为什么我要与之EOF完全比较int?如EOF定义的那样-1,它通常不会被投放到char?
是否有平台/编译器不适用?
可能重复:
返回包含数组的结构
我有一些简单的代码:
struct s {
char str[128];
};
struct s foo()
{
struct s s = { "some string" };
return s;
}
int main()
{
printf("%s\n", foo().str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是它会发出警告:
警告:格式'%s'需要'char*'类型的参数,但参数2的类型为'char [128]'[-Wformat]
如果我改变那样的主要功能
int main()
{
struct s s = foo();
printf("%s\n", s.str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一切都好.那么,第一个代码中的问题是什么?谢谢.
PS.即时通讯使用gcc-4.7.0
PPS.请注意,问题只发生在C编译器上,C++一切正常