我有两个相同(但命名不同)的C结构:
typedef struct {
double x;
double y;
double z;
} CMAcceleration;
typedef struct {
double x;
double y;
double z;
} Vector3d;
Run Code Online (Sandbox Code Playgroud)
现在我想将一个CMAcceleration变量赋给一个Vector3d变量(复制整个结构).我怎样才能做到这一点?
我尝试了以下但是得到了这些编译错误:
vector = acceleration; // "incompatible type"
vector = (Vector3d)acceleration; // "conversion to non-scalar type requested"
Run Code Online (Sandbox Code Playgroud)
当然,我可以单独设置所有成员:
vector.x = acceleration.x;
vector.y = acceleration.y;
vector.z = acceleration.z;
Run Code Online (Sandbox Code Playgroud)
但这似乎很不方便.
什么是最好的解决方案?
最近,我发现有些情况绝对会违反C++的ODR,但在C编译器中会编译好.
例如,这个奇怪的场景(和我一起):
来源1
int var_global=-3;
Run Code Online (Sandbox Code Playgroud)
来源2
#include <stdio.h>
#include <conio.h>
unsigned int var_global;
int main() {
printf("%d \n",var_global);
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有打印结果-3(即使在源2 var_global中unsigned)并且没有关于重新定义的错误var_global.
我知道C与C++有不同的规则,但我认为它不是那么不同.
我有谷歌并阅读了很多结果,但没有像 C++ 这样的官方结果.
所以问题是:
C有像C++这样的一个定义规则吗?
和:
什么叫官方?
我需要它与C++规则进行比较,这样我才能更深入地理解这两种语言.
p/s:我使用Visual Studio 2010编译上面的代码.
我在C++程序中遇到了一个分段错误,当两个C++文件一起编译时,每个C++文件包含一个不同的结构定义(具有相同的名称).
根据这个问题,我理解结构定义仅限于翻译单元(文件及其内容).
但是,在编译时启用-O1或更多时,我遇到了崩溃.以下最小代码再现了段错误.
代码有3个简短的C++文件和2个标题:
// td_collision1.cc
#include <iostream>
#include <vector>
#include <cstdlib>
#include "td1.h"
struct Data
{
long a;
double m1;
double m2;
};
void sz1(void) {
std::cout << "Size of in collision1: " << sizeof(struct Data) << std::endl;
}
void collision1(void) {
struct Data tmp;
std::vector<struct Data> foo;
for (int i=0; i<10; i++) {
tmp.a = 1;
tmp.m1 = 0;
tmp.m2 = 0;
foo.push_back(tmp);
}
}
// td1.h
#include <iostream>
void collision1(void);
void sz1(void);
// td_collision2.cc
#include …Run Code Online (Sandbox Code Playgroud)