当 char * 被类型定义并通过结构访问时,为什么编译器会看到 char * 和 printf 的转换说明符“s”不匹配?

2024-01-11

为什么编译器会抱怨以下 printf 中的参数类型“char”和转换说明符“s”不匹配?

#include <stdio.h>
#include <stdlib.h>
typedef char * STR;     // causes problems in printf below
int main(void) {
    struct MyStruct {
        STR str;
    };
    struct MyStruct ms = {"some text"};
    printf("%s\n", ms.str);
    return (EXIT_SUCCESS);
}

当删除 typedef 时,编译器不会抱怨相同的代码:

#include <stdio.h>
#include <stdlib.h>
//typedef char * STR;      // runs fine without typedef
int main(void) {
    struct MyStruct {
        char * str; //STR str;
    };
    struct MyStruct ms = {"some text"};
    printf("%s\n", ms.str);
    return (EXIT_SUCCESS);
}

Notes:

  • 系统 = Win 64、NetBeans IDE 8.2、GCC 编译器,无论使用 Cygwin 还是 MinGW 工具,或者无论是 32 位还是 64 位,都没有差异。

  • 如果我避免使用 struct 或 typedef,则会消除错误。但只要同时使用 typedef 和 struct 就会出现错误,如图所示。

  • 在发布之前,我检查了(除其他外)stackoverflow.com/questions/20944784/,其中建议使用 const。但是,无论 typedef 是否为,错误仍然存​​在

    指向常量 char 的指针 (typedef char const * STR); 指向 char 的常量指针 (typedef char * const STR);或者 指向常量 char 的常量指针 (typedef char const * const STR);

  • 逐字错误消息:参数类型“char”和转换说明符“s”不匹配。

  • 进一步测试表明 ms.str 确实是预期的 char * 类型(例如,正确的 sizeof、将 char 的转换说明符交换为“c”(如错误消息所示),如果 printf'ing 指向 char 的指针为一个字符等)

  • 更改 typedef 标识符的名称(例如,从 STR 更改为 STR_TEST)会导致相同的错误。所以看起来与标准头文件中的定义没有冲突。


在这个问题的评论回声中,这些参与者和 OP 似乎已经达成共识,认为这是 NetBeans 的错。

我无法在 Cygwin x64 上重现您的问题。此外,“参数类型“char”和转换说明符“s”不匹配”看起来不像 GCC 警告,可能是 Netbeans 问题。也可以看看这个类似的 Netbeans 错误报告 https://netbeans.org/bugzilla/show_bug.cgi?id=258511– RustyX 5 月 26 日 18:51

@BloodyPeasant gcc 没有错误消息说“参数类型“char”和转换说明符“s”不匹配”。 ,可能是 NetBeans 显示错误消息而不是 gcc,在这种情况下 NetBeans 是错误的,并且错误消息中的英语语法也很差。 – 5 月 26 日 19:33

@nos Ha,如此糟糕的语法是一个明显的迹象,表明这是一个 NetBeans 问题...在 NetBeans 的引擎盖下查看,看来您和 RustyX 是正确的,这只是一个 IDE 故障。谢谢大家。 – 血腥农民 5 月 27 日 2:01

...所以你的问题需要更正:

为什么编译器[NetBeans]抱怨以下 printf 中的参数类型“char”和转换说明符“s”不匹配?

编写 NetBeans 的人都是容易犯错误的人,而此错误消息就是这些错误之一的表现,即我们通常所说的“错误”、“故障”或“软件故障”的症状。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 char * 被类型定义并通过结构访问时,为什么编译器会看到 char * 和 printf 的转换说明符“s”不匹配? 的相关文章

随机推荐

  • Python模拟多个返回值

    我正在使用 pythons mock patch 并希望更改每个调用的返回值 这是警告 正在修补的函数没有输入 因此我无法根据输入更改返回值 这是我的代码供参考 def get boolean response response io pr
  • 什么是间接对象表示法,为什么它不好,以及如何避免它?

    标题几乎概括了这一点 但无论如何 这是长版本 在发布一小段 Perl 代码后 我被告知要避免间接对象表示法 因为它有几个副作用 该评论引用了这一行 my some object new Some Module FIELD gt value
  • 动态删除 org.hibernate.Criteria 中结果集的排序

    我有一个标准 Criteria criteria session createCriteria Libro class addOrder Order asc ID 但是 当我想要获取行计数失败时 criteria setProjection
  • CKEditor 不需要的字符

    如何禁用 CKEditor 每次都获取我的信息 nbsp 当我不想要它们时 我正在使用 CKEditor 和 jQuery 适配器 我不想有任何 nbsp tags 经过一些研究后 我可能会对这个问题有所了解 不幸的是没有现成的解决方案 在
  • NPM 警告“无存储库字段”,但我没有存储库

    我在家里使用node js 没有存储库 只是闲逛 但当我跑步时npm 安装 我得到无存储库字段如本文中讨论的警告其他问题线索 https stackoverflow com questions 16827858 npm warn packa
  • 实体框架与多个表/实体的并发

    我了解如何使乐观并发与实体框架一起用于单个表 但是如果我想在多个表之间实现乐观并发 情况又如何呢 为了说明我的意思 我将使用一个例子 车桌 轮表 汽车外键 每辆车多个轮子 当服务人员从汽车上添加 删除车轮时 如何管理并发性 在 Car 中添
  • android:如何从strings.xml中的字符串数组获取项目的属性

    我爸爸喜欢看他的电影 而且他有很多电影 他将光盘存放在多个活页夹中 但根本没有编目系统 我想我应该制作一个 Android 应用程序来帮助他找到它们 所以我认为 id 将信息存储在 strings xml 中的字符串数组中
  • 抄书UVa Online Judge动态规划解决方案

    我可以解决使用二分查找法 因为它很容易实现 但我刚刚开始解决动态规划问题 我想知道该问题的动态规划解决方案 在书籍印刷发明之前 制作书籍非常困难 一本书的副本 所有的内容都必须由手写重写 所以 称为抄写员 抄写员收到了一本书 经过几次之后
  • 从 proguard 中排除软件包

    在 proguard cfg 中排除父包后 如何包含一些包 Ex keep com myapp 我希望混淆 com myapp data 您可以使用 ProGuard 风格的正则表达式作为类名 keep class com myapp da
  • Google 电子表格 - 从下拉项填充行

    我正在为我兄弟的建筑公司创建一个 Google 文档电子表格 这是为了帮助他提供潜在工作的报价 这样他就可以控制成本 我有三张表 报价 设置 产品 报价将包含实际的逐项报价 设置将包含一些静态值 例如增值税 产品包含产品的实际成本 即木材
  • 从条目具有不同长度的字典创建数据框

    假设我有一本包含 10 个键值对的字典 每个条目都包含一个numpy array 然而 该长度array对他们来说并不相同 我如何创建一个数据框每列持有不同的条目 当我尝试时 import pandas as pd import numpy
  • 如何将 Hibernate 代理转换为真实的实体对象

    冬眠期间Session 我正在加载一些对象 其中一些由于延迟加载而作为代理加载 一切都好 我不想关闭延迟加载 但后来我需要通过 RPC 将一些对象 实际上是一个对象 发送到 GWT 客户端 而这个具体对象恰好是一个代理 所以我需要把它变成一
  • 在生产模式下收到“用户'root'@'localhost'访问被拒绝(使用密码:NO)”并且没有记录错误

    我部署了 Rails 应用程序 但所有页面上都出现 500 错误 我的 Production log 没有显示任何内容 这是一个问题 但我做了一个 脚本 控制台生产 并尝试运行一个简单的查询 User find first 它抛出了这个 A
  • 2条正态曲线的交点

    虽然我认为这是一个基本问题 但我似乎无法找出如何在 R 中计算它 2 个或多个正态分布 拟合在直方图上 的交点 我需要 x 值 例如具有以下参数 d data frame mod c 1 2 mean c 14 16 sd c 0 9 0
  • 有没有办法仅针对其副作用来应用重构脚本?

    我有一个库已更改为引入工厂方法来替换构造函数 原因现在并不重要 在当前情况下主要是为了改进类型推断 假设有is一个 Eclipse 重构脚本 所以我几乎有一个很好的计算机可读的更改描述 有什么方法可以apply该脚本仅适用于项目uses那个
  • IE8 - 带有 margin-top 的容器:10px 没有边距

    编辑 这只发生在 IE8 中 在 IE7 Firefox Opera 等中工作正常 首先 这是我在 Photoshop 中制作的一张图片来演示我的问题 http richardknop com pict jpg http richardkn
  • 调整 2D numpy 数组的大小(不包括 NaN)

    我正在尝试调整给定因子的 2D numpy 数组的大小 从而在输出中获得更小的数组 该数组是从图像文件中读取的 其中一些值应该是 NaN 不是数字 来自 numpy 的 np nan 它是卫星遥感测量的结果 只是没有测量 一些像素 我为此找
  • Gnuplot 不同颜色

    我试图用不同的颜色为绘图和 gnuplot 中的拟合着色 但它不起作用 set ylabel s in m set xlabel t in s unset key set style line 1 lt 2 lc rgb red lw 3
  • 在 Flutter 应用程序中使用 Stripe 保持 PCI 合规性

    我正在将 Stripe 集成为支付网关 并且我正在考虑flutter stripe包装上写着 简化安全性 我们让您可以轻松收集信用卡号等敏感数据并保持 PCI 合规性 这意味着敏感数据将直接发送到 Stripe 而不是通过您的服务器 有关更
  • 当 char * 被类型定义并通过结构访问时,为什么编译器会看到 char * 和 printf 的转换说明符“s”不匹配?

    为什么编译器会抱怨以下 printf 中的参数类型 char 和转换说明符 s 不匹配 include