Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

プリプロセッサを使って少し違うロジックを使い分ける

OSSプロジェクトでは良く見かけるifdef
自前のコードだと余り使わない子ですが、使い所はあります。

種類によって一行だけ違うコードがある場合、ifdefやif defineを使うと楽にいけます。

パターン1:ifdef

対象コード

#include <stdio.h>

int main() {
  printf("yes\n");

  #ifdef COORDINATOR
    printf("###coordinator###\n");
  #endif

  #ifdef ROUTER
    printf("###router###\n");
  #endif

  #ifdef ENDDEVICE
    printf("###enddevice###\n");
  #endif

  return 0;
}

結果

$ gcc ifdeftest.c -D"ENDDEVICE" -o ifdeftest.o
$ ./ifdeftest.o 
yes
###enddevice###

$ gcc ifdeftest.c -D"ROUTER" -o ifdeftest.o
$ ./ifdeftest.o 
yes
###router###

$ gcc ifdeftest.c -D"COORDINATOR" -o ifdeftest.o
$ ./ifdeftest.o 
yes
###coordinator###

パターン2 #if define

if defineを使うと、elseifに相当するelifを使える事から少しスッキリします。

対象コード

#include <stdio.h>

int main() {
  printf("yes\n");

  #if defined COORDINATOR
    printf("###coordinator if###\n");
  #elif defined ROUTER
    printf("###router elif###\n");
  #elif defined ENDDEVICE
    printf("###enddevice elif###\n");
  #endif

  return 0;
}

結果

$ gcc ifelif.c -D"COORDINATOR" -o ifelif.o
$ ./ifelif.o 
yes
###coordinator if###
$ gcc ifelif.c -D"ROUTER" -o ifelif.o                                                                                           
$ ./ifelif.o 
yes
###router elif###
$ gcc ifelif.c -D"ENDDEVICE" -o ifelif.o                                                                                        
$ ./ifelif.o 
yes
###enddevice elif###