Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 根据时间为消息创建宏_C_Macros_Printf - Fatal编程技术网

C 根据时间为消息创建宏

C 根据时间为消息创建宏,c,macros,printf,C,Macros,Printf,我正在尝试为我的C语言程序创建一个宏,以便在printf中使用 正在编译中,正在向我返回警报C4474 C4474: too many arguments passed for format string 有人知道错误的原因吗?您需要将其他条件级联: #define TIME(t) \ (((t)->tm_hour >= 6 && (t)->tm_hour < 12) ? "Good morning" : \ ((t)->tm_ho

我正在尝试为我的C语言程序创建一个宏,以便在printf中使用

正在编译中,正在向我返回警报C4474

C4474: too many arguments passed for format string

有人知道错误的原因吗?

您需要将其他条件级联:

#define TIME(t) \
   (((t)->tm_hour >=  6 && (t)->tm_hour < 12) ? "Good morning" : \
    ((t)->tm_hour >= 12 && (t)->tm_hour < 18) ? "Good afternoon" : \
    ((t)->tm_hour >= 18 && (t)->tm_hour < 23) ? "Good night" : "")
#定义时间(t)\
(((t)->tm_hour>=6&&(t)->tm_hour<12)?“早上好”:\
((t)->tm_hour>=12&&(t)->tm_hour<18)?“下午好”:\
((t)->tm_hour>=18&&(t)->tm_hour<23)?“晚安”:“

您对这个
?:&&&?:…有什么期望语法怎么办?你遇到了一个永远看不到“晚安”的问题;很少有数字同时是18或更大,也小于零。您可能需要
…>=18 | |…<6
。您还需要修复
?:&&&&:符号指出。将不评估
&
的RHS。在宏表达式和参数(因此在宏展开中使用
(t)->tm_hour
)周围加上括号也是一种很好的做法。最好在整个宏周围加上
()
。@Carol
为什么你认为使用宏不好?
可以写满一本书。这里有一些亮点:a)作为宏,所有代码在每次使用时都会被复制。作为一个函数,它只存在一次,并从多个位置调用。b) 正如你通过提问所看到的,它更复杂。如果函数中存在if-else,那么您就可以编写下一段代码,而不是在这里发布。c) 宏会使代码更难阅读和调试。例如,您的名字不好-应该是来自时间的
问候\u STR\u
或类似名称。请注意,如果您使用
t->tm\u hour
调用它,而不是向它传递
struct tm*
,那么您的宏会更灵活。它也将更加简洁。奇怪的是,在一天的23:00到下一天的06:00之间,没有向用户打招呼。然而,这更像是一个用户体验问题,而不是基本编码问题,这个问题已经被公认的答案充分解决了。
C4474: too many arguments passed for format string
#define TIME(t) \
   (((t)->tm_hour >=  6 && (t)->tm_hour < 12) ? "Good morning" : \
    ((t)->tm_hour >= 12 && (t)->tm_hour < 18) ? "Good afternoon" : \
    ((t)->tm_hour >= 18 && (t)->tm_hour < 23) ? "Good night" : "")