在许多C和C++文件中,我看到了这样的宏:
#ifdef X
#undef X // no statements in between
#endif
我觉得,只写一句就够了:
#undef X
如果未定义宏X,则#undef不应产生任何影响。
如果我只想取消定义一个宏,那么可以使用独立的#undef吗?这是否会使编码实践变得糟糕?
JavaScript有7种基本数据类型:字符串、数字、布尔值、null、未定义的、符号、bigint。
我理解三种数据类型,字符串、数字、布尔;我也理解bigint是因为数字不够而引入的。数字是简单浮点数的一个例子:
var a = 1.000000000000001;
var b = 1.0000000000000001;
console.log(Number.isInteger(a)) //false
console.log(Number.isInteger(b)) // true
以下是我的问题:
什么是未定义的?它与c++中的void相同吗?但是void是一个关键字。为什么未定义
在C++中,释放仍由引用引用的内存是否存在未定义的行为,即使该引用不再被使用?例如,下面的函数是否调用未定义的行为?
void foo() {
std::map<std::string, int> mymap;
{
int& val = mymap["eight"];
val = 8;
mymap.erase("eight"); // Oops! val still refers to mymap["eight"]
// val is not us
我已经开始学习C++了,我已经知道C和Java了。我已经开始学习它,因为我想开始使用面向对象编程。
然而,我被代码卡住了,因为编译器生成了“对Actor的vtable的未定义的引用”。在这里,你有生成相同错误的代码,而不是原始的错误,因为它不太清楚。我真的不知道是什么原因造成的。
struct Actor
{
int x, y;
virtual void move();
};
struct Player : Actor
{
Player(int a, int b)
{
x = a;
y = b;
}
我正在学习关于函数组合的教程,我一直看到在值声明的末尾使用的操作符。
我知道它在参数之前表示泛型,但当您看到它时,它意味着什么:
let add x y = x + y
let myFunc' = add 10
我唯一能看到的是,‘只是标识符中的另一个字符。是那么回事吗?因为如果我使用相同的示例,使用myFunc会产生一个未定义的错误,其中myFunc‘会解析。
如果你知道两条信息:
一个记忆地址。
存储在该地址中的对象的类型。
然后,逻辑上就有了引用该对象所需的全部内容:
#include <iostream>
using namespace std;
int main()
{
int x = 1, y = 2;
int* p = (&x) + 1;
if ((long)&y == (long)p)
cout << "p now contains &y\n";
if (*p == y)
cout <&
ABI标准中的内存布局相关规范通常只适用于ABI边界,还是也适用于翻译单元,或者如果不是这样,编译器通常会提供这样的附加保证吗?
如果“一般”过于宽泛,请考虑GCC/Clang与V系统x64和Itanium C++ ABIs。
这里有两个例子说明我的意思:
System x64 ABI指定大小至少为16个字节的数组的对齐至少为16个字节,即使元素类型的对齐较小,因此对齐比alignof建议的更严格。它还指定long double的对齐是16。那么,如果调用C++标准,下面的函数是否具有未定义的行为,可以在System x86 ABI下安全地使用,即使storage数组从未跨翻译单元边界公开
为什么模板变体返回类型会导致bad_variant_access异常?
Unhandled exception at 0x779508B2 in Project2.exe: Microsoft C++ exception: std::bad_variant_access at memory location 0x00B3FB00.
在另一个较大的程序中,main中的语句执行时没有错误,但输出了一些142以外的奇怪值。这似乎是一种未定义的行为。
/////////////////////minified_main.cpp/////////////////
#include <iostrea
如果我正确理解,这个程序在C++中有未定义的行为,因为中间值p + 1是指向未初始化内存的指针:
int main () {
int x = 0;
int *p = &x;
p = p + 1 - 1;
*p = 5;
}
如果void被放在main的参数列表中(按照C语法的要求),它是否也是C中未定义的行为?
在阅读了很多有关这方面的帖子后,我想澄清下一点:
A* a = new A();
A* b = a;
delete a;
A* c = a; //illegal - I know it (in c++ 11)
A* d = b; //I suppose it's legal, is it true?
因此,问题是如何使用值 of 复制已删除指针的。
我曾读过,在c++ 11中,读取a的值会导致未定义的行为,但是阅读b的值又如何呢?
尝试读取指针的值(注意:这与取消引用指针不同)导致实现自C++14以来定义的行为,这可能包括生成运行时错误。(在C++11中是未定义的行为)
无论是在C中还是在C++中,我认为这个非法程序(根据C或C++标准的行为是未定义的)很有趣:
#include <stdio.h>
int foo() {
int a;
const int b = a;
a = 555;
return b;
}
void bar() {
int x = 123;
int y = 456;
}
int main() {
bar();
const int n1 = foo();
const int n2 = foo();
const int n3 = foo();
来自(6.2.2/7)节C99标准
7.如果在翻译单元中出现具有内部和外部链接的相同标识符,则行为未定义。
由于定义冲突,以下内容会生成编译时错误
// 'x' has external linkage
extern int x;
// Here, 'x' has internal linkage
static int x;
但是下面的编译很好,
// 'x' has external linkage
extern int x;
void foo() {
// Here, 'x' has internal link
我阅读并重读了C++标准中有关网上解决的相关条款,但这个问题仍然对我开放。该标准规定,内联功能的定义应出现在所使用的每个翻译单位中,定义应在几乎一页所描述的意义上相同。它说标记序列必须是相同的。它包括本地标识符名称吗?
换句话说,是否违反了ODR? (我尝试用Visual 2008进行测试,得到0错误和0警告)。但我想这并不能证明什么,因为我随后将示例更改为两个完全不同的定义,仍然得到0错误和0警告。应当指出,作为MSVC的借口,违反网上解决的行为不需要正式诊断)。
//main.cpp
inline int f(int);
int main(){
f(3);
}
int f(int x
我正在定义一个C++头文件,由于某种原因,当我试图引用在同一个文件中定义的结构以及我创建的枚举类时,我创建的类会出现错误。
虽然我有一些使用C++和C#的经验,但我对Java还很陌生。即使这样,我的编程经验也相对较低。我的引用初始化错误了吗?我是否应该将结构和枚举都放在一个单独的头文件中?
#include <iostream>
#include <stdio.h>
class Character
{
private:
Stats stats; //<--error: "Type 'Stats' could not be re
假设我执行以下操作:
void g(int* x)
{
int y = 0;
auto diff = uintptr_t(&y) - uintptr_t(x);
}
void f()
{
int x = 0;
g(&x);
}
diff只是具有未定义的值,还是代码调用了未定义的行为?根据规范,代码是否能够很好地运行并为diff计算一个值(可能毫无意义),或者它是否调用UB?我相信有一些无关的变量,但不能准确地指出。
我对任何标准的答案感兴趣,因为(包括) C++ 11。
讨论来自于:中的评论
我写了这段代码:
#define HIDE __attribute__((visibility("hidden")))
HIDE int main(){
int x = 10;
int z = 5;
int c;
c = call1(x,z);
}
HIDE int call1(int a,int b)
{
int r;
r = a+b;
return r;
}
但是当我试图编译它时,我得到了以下错误: error:使用未声明的标识符'call1‘c=call1(x,z);
我已经在这里看过了,但没有发现类似