2011-05-21 5 views
16
#include<stdio.h> 
void f(int a) 
{ 
printf("%d", a); 
} 
#define f(a) {} 

int main() 
{ 
/* call f : function */ 
} 

Cách gọi f (chức năng)? Viết f(3) không hoạt động bởi vì nó được thay thế bằng {}có cùng tên với macro

+1

Không ngu ngốc. Giả sử bạn có macro thực hiện thay thế nội tuyến cho 'f' trong tệp tiêu đề của nó và bạn muốn sử dụng macro này để xác định triển khai bên ngoài trong tệp triển khai. Đây là một thực hành tiêu chuẩn. –

+0

Thật ngu ngốc như một câu hỏi phỏng vấn. Tôi không muốn làm việc cho một công ty có nhu cầu này. –

Trả lời

15

(f)(3); hoạt động không?

Bộ tiền xử lý C không mở rộng macro f bên trong ().


+3

Bạn có thể giải thích lý do tại sao tính năng này hoạt động không? –

+4

Tôi không đồng ý rằng nó ngớ ngẩn. Đây là một kỹ thuật mà bất kỳ lập trình viên C nào có ý định sử dụng bộ tiền xử lý nên biết. –

+4

@Prasoon: Ngạo mạn của nó để gọi câu hỏi "ngớ ngẩn". Chỉ vì bạn biết câu trả lời, không làm cho nó "ngớ ngẩn". – Nawaz

1

Một giải pháp được đăng bởi @Prasoon, khác có thể chỉ giới thiệu tên khác cho hàm, NẾU bạn không thể thay đổi tên của chức năng, không phải tên của macro:

#include<stdio.h> 
void f(int a) 
{ 
    printf("%d", a); 
} 


#define fun (f) //braces is necessary 

#define f(a) {} 

int main() 
{ 
    fun(100); 
} 

bản demo trực tuyến : http://www.ideone.com/fbTcE

+0

'Cách gọi f' (không phải chúng ta gọi là 'fun' ở đây? Bởi vì nếu gọi' fun' là ok thì chúng ta có thể thay đổi tên của hàm 'f()' thành 'fun()':)) – iammilind

+0

@iammilind: vui không hoạt động, bộ tiền xử lý thay thế bằng 'f' (chức năng thực tế). – Nawaz

7
int main() 
{ 
#undef f // clear f! 
f(3); 
} 
+1

Sau khi macro hoàn tác biến mất! – Nyan

+0

@Nyan và bạn đã downvoted cho điều đó :). Người hỏi đã không đề cập đến điều kiện như vậy. Lấy trường hợp nếu macro được xác định trong một tệp tiêu đề chung và được sử dụng trong một số tệp khác. Đối với các tệp bạn không muốn sử dụng, bạn sẽ chỉ đơn giản là '# undef'. – iammilind

+4

+1 để viết câu trả lời đúng có thể sẽ làm phiền người phỏng vấn! – Raynos

4

Sử dụng con trỏ hàm để đạt được điều này:

int main() { 
    void (*p)(int a); 
    p = f; 
    p(3); //--> will call f(3) 
    return 0; 
}