He who is Shy* size bir answer mikrop verdi, ama sadece mikrop. C ısıtma-öncesi işlemci bir dizeye bir değer dönüştürmek için temel teknik '#' operatör ile gerçekten de, önerilen çözümün bir basit çevirisi bir derleme hata alır:
#define TEST_FUNC test_func
#define TEST_FUNC_NAME #TEST_FUNC
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
yazım hatası verildi 'koyar()' satırı - sorun kaynağında bir 'başıboş' '. C standardının bölümünde 6.10.3.2 yılında
, '# operatörü', diyor:
Each # preprocessing token in the replacement list for a function-like macro shall be followed by a parameter as the next preprocessing token in the replacement list.
sorun dizeleri makro argümanlar dönüştürebilirsiniz olmasıdır - ama rastgele dönüştürmek olamaz Makro bağımsız değişkenler olmayan öğeler.
Böylece, peşinden olduğunuz etkiyi elde etmek için, kesinlikle fazladan iş yapmak zorundasınız.
#define FUNCTION_NAME(name) #name
#define TEST_FUNC_NAME FUNCTION_NAME(test_func)
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
Sana makroları kullanmayı planlıyorsanız nasıl tamamen net değilim, ve nasıl tamamen tekrarını önlemek planlıyoruz. Bu biraz daha ayrıntılı örnek, daha bilgilendirici olabilir. STR_VALUE değerine eşdeğer bir makronun kullanılması, istenen sonucu elde etmek için gerekli olan bir deyimdir. Bu cevap ilk yazıldığı anda
*
#define STR_VALUE(arg) #arg
#define FUNCTION_NAME(name) STR_VALUE(name)
#define TEST_FUNC test_func
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)
#include <stdio.h>
static void TEST_FUNC(void)
{
printf("In function %s\n", TEST_FUNC_NAME);
}
int main(void)
{
puts(TEST_FUNC_NAME);
TEST_FUNC();
return(0);
}
,
shoosh adının bir parçası olarak 'Shy 'ın adı kullanılıyor'.
([dizeleri oluşturmak için C Makro] olası çift http://stackoverflow.com/questions/798221/c-macros -to-oluşturmak-dizeleri) – rjstelling