Tôi đã tự hỏi liệu có bất kỳ điều gì sai trái khi truyền con trỏ tới putchar hay bất kỳ hàm chuẩn nào khác có thể được thực hiện dưới dạng macro, chức năng chấp nhận một con trỏ hàm. Dưới đây là một ví dụ về những gì tôi đang làm.Chuyển một con trỏ tới hàm putchar đến một hàm nhận int (*) (int)
#include <stdio.h>
static int print(const char *s, int (*printc)(int))
{
int c;
while (*s != '\0') {
if ((c = printc(*s++)) < 0)
return c;
}
return printc('\n');
}
int main(void)
{
print("Hello, world", putchar);
return 0;
}
Tôi không gặp phải bất kỳ vấn đề nào khi biên dịch với GCC và Clang dưới GNU/Linux, cũng như GCC theo OpenBSD. Tôi tự hỏi liệu nó sẽ có cùng một hành vi theo mọi tiêu chuẩn thực hiện tương thích khác, vì putchar có thể được thực hiện như một macro. Tôi đã tìm kiếm thông qua các tiêu chuẩn, đặc biệt là các phần trên con trỏ hàm và putchar, và đã không thể tìm thấy bất cứ điều gì mà chỉ định cho dù điều này là hợp pháp hay không.
Cảm ơn.
Nếu "chức năng" của bạn thực sự là macro, thì mã của bạn sẽ không biên dịch. –
Không chắc liệu đây có phải là tiêu chuẩn tuân thủ hay không, nhưng với 'gcc', hành vi này có vẻ như được mong đợi: http://gcc.gnu.org/onlinedocs/cpp/Function_002dlike-Macros.html – RageD
Làm điều đó * chỉ * macro .. –