草庐IT

c++ - int (*) (int *) = 5(或任何整数值)的含义

coder 2023-04-26 原文

我想不通:

int main() {
    int (*) (int *) = 5;
    return 0;
}

上面的赋值是用 g++ c++11 编译的。我知道 int (*) (int *) 是一个指向函数的指针,该函数接受 (int *) 作为参数并返回一个 int,但我不明白你怎么能把它等同于 5。起初我以为它是一个不断返回 5 的函数(从我最近在 F# 中学习,可能,哈哈),然后我简要地认为,函数指针指向内存位置 5,但是显然,这不起作用,十六进制值也不起作用。

认为这可能是因为函数返回一个 int,并且分配一个 int 是可以的(不知何故),我也尝试了这个:

int * (*) (int *) = my_ptr

其中 my_ptrint * 类型,与第二个函数指针的类型相同,与第一种情况下的 int 类型相同。这不编译。分配 5 或任何 int 值,而不是 my_ptr,也不会为此函数指针编译。

那么赋值是什么意思呢?

更新 1

我们已确认这是一个错误,如最佳答案所示。但是,仍然不知道您分配给函数指针的值实际发生什么,或者分配发生了什么。任何(好的)解释都将非常感激!请参阅下面的编辑以更清楚地了解问题。

编辑 1

我使用的是 gcc 版本 4.8.2(在 Ubuntu 4.8.2 中)

编辑 2

实际上,在我的编译器上将它等同于任何东西都可以。甚至将其等同于 std::string 变量或返回 double 的函数名也可以。

编辑 2.1

有趣的是,让它成为一个函数指针,指向任何返回非指针数据类型的函数,都会让它编译,比如

std::string (*) () = 5.6;

但是一旦函数指针指向一个返回某个指针的函数,它就不会编译,比如with

some_data_type ** (*) () = any_value;

最佳答案

这是 g++ 中的一个错误。

 int (*) (int *) 

是一个类型名称。

在 C++ 中,你不能有一个没有标识符的类型名称的声明。

所以这是用 g++ 编译的。

 int (*) (int *) = 5;

这也可以编译:

 int (*) (int *);

但它们都是无效的声明。

编辑:

T.C.评论中提到的 bugzilla 错误 60680有一个类似的测试用例但还没有被批准。该错误已在 bugzilla 中得到确认。

EDIT2:

当上面的两个声明在文件范围内时,g++ 正确地发出诊断(它无法在 block 范围内发出诊断)。

EDIT3:

我检查过,我可以在最新版本的 g++ 版本 4 (4.9.2)、最新的预发布版本 5 (5.0.1 20150412) 和最新的实验版本 6 (6.0.0 20150412) 上重现该问题。

关于c++ - int (*) (int *) = 5(或任何整数值)的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29636819/

有关c++ - int (*) (int *) = 5(或任何整数值)的含义的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  5. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  6. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

    有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

  9. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

  10. ruby - 如何在 Ruby 中将负整数转换为二进制 - 2

    问题1:我无法通过以下方式找到将负整数转换为二进制的方法。我应该像这样转换它。-3=>"11111111111111111111111111111101"我在下面试过:sprintf('%b',-3)=>"..101"#..appearsanddoesnotshow111111bit.-3.to_s(2)=>"-11"#Thisjustadds-tothebinaryofthepositiveinteger3.问题2:有趣的是,如果我使用在线转换器,它告诉我-3的二进制是“0010110100110011”。"11111111111111111111111111111101"和"001

随机推荐