我正在使用mingw-w64(gcc 7.3.0),并且在使用以下命令编译任何C ++程序时:
g++ file.cpp -fsanitize=undefined
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
... mingw32 / bin / ld.exe:找不到-lubsan
但是,如果删除该-fsanitize=undefined标志,则能够成功编译并运行程序。经过一些研究,我发现这意味着缺少库ubsan(未定义行为消毒剂),但是我找不到关于库的任何信息。我该如何解决?
我正在Euler项目中尝试问题8,在该问题中,必须找到给定的1000位数字中13个相邻数字的最大乘积。但是,在编译期间,我得到“整数文字太大,无法用任何整数类型表示”。关于如何解决此错误/解决此错误的任何想法?
到目前为止的代码是:
#include <iostream>
using namespace std;
int main() {
unsigned long long double number = 7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450;
cout << number << endl;
}
Run Code Online (Sandbox Code Playgroud) 下面的代码是否定义明确并保证按预期工作?
#include <iostream>
#include <string>
using std::string;
int main() {
string const a[2][2][2] = {
"1", "2", "3", "4", "5", "6", "7", "8",
};
auto constexpr sz = sizeof(a) / sizeof(string);
auto const p = reinterpret_cast<string const*>(&a);
for (std::size_t i = 0; i < sz; ++i) std::cout << p[i] << '\n';
}
Run Code Online (Sandbox Code Playgroud)
据我所知,因为我们将它转换为一个指针,只要我们访问有效内存,就没有越界规则适用,因此,这是可以的。但我不能确定。
注意:我不是在问数组是否是连续的(它是),我是在问将多维数组转换为平面指针并使用它来访问所有元素是否定义良好(不是 UB)。
语境
我正在研究 C 中的指针,为此我正在测试一些指针的算法,在其中一次尝试中,我做了一些直到现在都在窃听的小改动。
这是代码:
char *s = "ABCDEF";
char **y = &s;
printf("%p\n", s);
printf("%p\n", &s);
printf("%p\n", y);
printf("%p\n", &s[0]);
Run Code Online (Sandbox Code Playgroud)
问题是,出于某种原因,当我要求 C 打印 S 的指针(不带&符号)时,我收到一个指针,但是当我放置&符号时,我会收到另一个不同的指针。我认为这没有发生,因为&符号会给我 S 的地址。
因此,为了检查是否不是错误,我创建了一个带有 S 地址的指针,并且我收到了与预期相同的“&s”,但是当我使用“&s[0]”时,我收到了单个“s”。
那么,如果在这两种情况下我都只要求字符串的第一个字符,为什么 C 会给我两个结果?
我收到的价值观
0x400634
ox7ffd95c33090
ox7ffd95c33090
0x400634
Run Code Online (Sandbox Code Playgroud)
我知道可能我忘记了一些逻辑,但我一直在努力解决这个问题,所以如果有人可以帮助我,我会很感激。
inline在说明符的 cppreference 页面上,它说:
inline当在函数的decl-specifier-seq中使用说明符时,该说明符将该函数声明为内联函数。
内联函数具有以下属性:程序中
可以有多个内联函数的定义,只要每个定义出现在不同的翻译单元中并且所有定义都相同。
...
然后,稍微低一点,它说,
该关键字的最初目的
inline是向优化器指示函数的内联替换优于函数调用。...
除了这一行之外,没有任何关于 的使用的参考inline。后一个含义inline在 C++ 标准中仍然有效吗?或者后一种形式是否比前一种形式被弃用?
如果后一种形式仍然有效,是否值得在现代编译器中使用它?我听说,即使是编译器做出内联决定,但使用inline关键字会稍微推动它。这是真的?对于这种情况,我应该inline在程序中使用关键字吗?
== 不是我们如何比较两个数组,因为这只会比较地址:
#include <iostream>
int main()
{
char a[] = "aaa";
char b[] = "aaa";
if (a == b)
std::cout << "Yes" << std::endl;
else
std::cout << "No" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码甚至给了我一个警告:
数组比较始终计算为false
但是当我尝试这个时:
if ("aaa" == "aaa")
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常.仍然给我一个警告,但警告是:
条件总是如此
起初,我认为它是某种缓存的东西,所以我尝试了一个相当不寻常的字符串文字:
if ("whuiwhqohqweihqweohi" == "whuiwhqohqweihqweohi")
Run Code Online (Sandbox Code Playgroud)
在MSVC和g ++上仍然可以正常工作.这是一个依赖于实现的行为吗?我理解比较编译时已知的变量并不是很有用,但我的问题只是"这是怎么回事?".
此外,使用auto似乎也有效:
#include <iostream>
int main()
{
auto a = "whuiwhqohqweihqweohi";
auto b = "whuiwhqohqweihqweohi";
if (a == b) {
std::cout << "Yes" << std::endl;
}
else {
std::cout << …Run Code Online (Sandbox Code Playgroud) 根据 C++ 规范
一个字节至少足以包含基本执行字符集 (2.3) 的任何成员和 Unicode UTF-8 编码形式的八位代码单元,并且由连续的位序列组成,其数量为实现定义。
这意味着,一个字节中的位数必须是 8 位或多于 8 位。
现在,根据 gcc,位数由 ABI 确定。
4.4 字符
一个字节中的位数(C90 3.4、C99 和 C11 3.6)。
由 ABI 确定
GCC 基于 ABI - http://itanium-cxx-abi.github.io/cxx-abi/
任何人都可以指出我提到字节中位数的位置吗?
在GCC 7上,我已在Qt creator 4.9上启用了大多数警告。现在,我有一个switch语句,它涵盖了所有枚举值。如果添加,default:我会收到警告(来自Qt创建者):
warning: default label in switch which covers all enumeration values
Run Code Online (Sandbox Code Playgroud)
如果我删除,default:则会收到另一个警告(来自GCC):
error: this statement may fall through [-Werror=implicit-fallthrough=]
}
^
error: all warnings being treated as errors
Run Code Online (Sandbox Code Playgroud)
我应该做些什么?关闭警告?它们很有用,我不想关闭它们中的任何一个,但是Wimplicit-fallthrough似乎有问题。
[[fallthrough]]无济于事,因为cases以a结尾return(从Qt创建者那里):
warning: fallthrough annotation in unreachable code
Run Code Online (Sandbox Code Playgroud)
__attribute__ ((fallthrough))也没做任何事 /* FALLTHRU */或[[gnu::fallthrough]]或都没有// fall through。大概是因为-pedantic?
例:
enum class E {a, b, c};
QVariant fun(E e) {
switch (e) {
case …Run Code Online (Sandbox Code Playgroud) 这是有效的C ++吗?
int main()
{
int i = 0;
int* pi = &i;
++pi;
}
Run Code Online (Sandbox Code Playgroud)
我知道数组类型允许使用单末尾指针,但是在这种情况下我不确定。从技术上讲,该代码是否具有未定义的行为?
如果我这样做:
#define F a
F/
Run Code Online (Sandbox Code Playgroud)
它扩展到 a/ godbolt
如果我这样做:
#define F /
F/
Run Code Online (Sandbox Code Playgroud)
它扩展到/ /中间有一个空格goodbolt
但是,如果我将其转换为字符串并打印出来,它不会添加任何空格goodbolt:
#include <stdio.h>
#define STR_IMPL(x) #x
#define STR(x) STR_IMPL(x)
#define F /
int main() {
puts(STR(F/));
}
Run Code Online (Sandbox Code Playgroud)
为什么中间有空格,但只有某些时候?在其他情况下是否允许添加更多空格?