这是我的警告.
Missing sentinel in function call
Run Code Online (Sandbox Code Playgroud)
我怎么能删除它.
我正在使用linux和gcc编译器.
根据标准N4713(7.11/1)的草案:
空指针常量是一个整数文字(5.13.2),其值为零或prvalue类型
std::nullptr_t.
和21.2.3/2:
宏
NULL是一个实现定义的空指针常量.
以下NULL可以定义为nullptr.cppreference上提到了相同的内容:
#define NULL 0
//since C++11
#define NULL nullptr
Run Code Online (Sandbox Code Playgroud)
同时"Additive operators"条款说(8.5.6/7):
如果将值
0添加到空指针值或从空指针值中减去该值,则结果为空指针值.如果减去两个空指针值,则结果将等于0转换为该类型的值std::ptrdiff_t.
因此,以下代码应该是有效的:
0 + nullptr;
nullptr - nullptr;
Run Code Online (Sandbox Code Playgroud)
但由于缺乏+/-运营商对于std::nullptr_t该代码是无效的.
有没有我没有考虑到的东西或NULL宏不能实际定义为nullptr?
在C中,可以有一个字符串文字
char *string = "string here";
Run Code Online (Sandbox Code Playgroud)
整数文字:
uint8_t num = 5;
Run Code Online (Sandbox Code Playgroud)
长文字:
long long bigNum = 90322L;
Run Code Online (Sandbox Code Playgroud)
浮点文字:
float decimal = 6.3f;
Run Code Online (Sandbox Code Playgroud)
这是一种指针文字的方法吗?这是内存空间的文字地址.我正在做一些嵌入式项目的工作,需要硬编码DMA访问的值.我正在做类似以下的事情:
uint32_t *source = 0x08000000;
Run Code Online (Sandbox Code Playgroud)
虽然这编译并正常工作,我得到以下编译器错误(我正在使用的变体GCC):
cc0144: {D} warning: a value of type "int" cannot be used to initialize an entity of type "uint32_t *"
cc0152: {D} warning: conversion of nonzero integer to pointer
Run Code Online (Sandbox Code Playgroud)
有没有正确的方法来做到这一点,或者我只需要接受这个作为C的事实?我知道我能做到:
uint32_t *source = (uint32_t *)0x08000000;
Run Code Online (Sandbox Code Playgroud)
但这似乎是非常不必要的.这样做的行业方式是什么?我也想知道C++中是否存在此功能.
在C89/C99 +中使用NULL优先于0是否有"硬"原因,并且在不考虑与标准符合性相关的深层关注的情况下进行交换,即使在使用C的非常模糊的方面的代码中也是如此.
我关注标准合规性,可移植性,未定义的行为,与语言的意外角落的意外不同的交互等"硬"事物,(假设的)Milliard Gargantubrain分段记忆超级计算机是否可能释放其魔法烟雾等,如果你替换一个为了另一个.
在这个网站上已经有一个关于C++的类似问题,但我不关心C++.我相信这是C++行为可能与C不同的领域之一.
风格和意图的问题虽然很重要,但并不认为在问答论坛中讨论它们是主题性的或有用的.
我和其他人发现的答案主要涉及测试和分配(我们通常会看到,并且可以互换使用它们是安全的).我问是否有任何想法需要采取你已经找到的任意奇怪但符合标准的代码,并在语法上将NULL替换为0(或者当0是指针时可能反之亦然),无论是否是做风格的明智之举.很难给出意想不到的交互的例外,但是,例如,功能指针经常会把我们赶出去,也许是尺寸,....
我已经阅读了描述0和NULL如何表现的相关标准部分,有人可以帮助我在不明显的情况下对指针常量0和NULL的交换产生影响吗?或者向我保证没有.