A larger module is easier to maintain when names are private by default and only the intended API is public.

Program

Play the program to choose a count and call the one public formatting function.

count
private_public.f90
Replay: real traced execution (multi-file project)
module catalog_mod
    implicit none
    private
    public :: label_count
contains
    function label_count(count) result(label)
        integer, intent(in) :: count
        character(len=16) :: label
        write(label, '(A,I0)') 'items=', count
    end function label_count
end module catalog_mod

program private_public_demo
    use catalog_mod, only: label_count
    implicit none
    integer :: count
    character(len=16) :: label

    count = 3
    label = label_count(count)
    print '(A)', trim(label)
end program private_public_demo
module catalog_mod
    implicit none
    private
    public :: label_count
contains
    function label_count(count) result(label)
        integer, intent(in) :: count
        character(len=16) :: label
        write(label, '(A,I0)') 'items=', count
    end function label_count
end module catalog_mod

program private_public_demo
    use catalog_mod, only: label_count
    implicit none
    integer :: count
    character(len=16) :: label

    count = 1
    label = label_count(count)
    print '(A)', trim(label)
end program private_public_demo
module catalog_mod
    implicit none
    private
    public :: label_count
contains
    function label_count(count) result(label)
        integer, intent(in) :: count
        character(len=16) :: label
        write(label, '(A,I0)') 'items=', count
    end function label_count
end module catalog_mod

program private_public_demo
    use catalog_mod, only: label_count
    implicit none
    integer :: count
    character(len=16) :: label

    count = 6
    label = label_count(count)
    print '(A)', trim(label)
end program private_public_demo
  1. count ← 3

    19count = 320label = label_count(count)
    values this step3count
  2. label ← items=3

    19count = 320label = label_count(count)21print '(A)', trim(label)
    values this stepitems=3label3count
  3. print '(A)', trim(label)

    20    label = label_count(count)21    print '(A)', trim(label)22end program private_public_demo
    outputitems=3
    values this stepitems=3label
  1. count ← 1

    19count = 120label = label_count(count)
    values this step1count
  2. label ← items=1

    19count = 120label = label_count(count)21print '(A)', trim(label)
    values this stepitems=1label1count
  3. print '(A)', trim(label)

    20    label = label_count(count)21    print '(A)', trim(label)22end program private_public_demo
    outputitems=1
    values this stepitems=1label
  1. count ← 6

    19count = 620label = label_count(count)
    values this step6count
  2. label ← items=6

    19count = 620label = label_count(count)21print '(A)', trim(label)
    values this stepitems=6label6count
  3. print '(A)', trim(label)

    20    label = label_count(count)21    print '(A)', trim(label)22end program private_public_demo
    outputitems=6
    values this stepitems=6label
private `private` hides module names unless they are explicitly exported.
public API `public :: label_count` keeps one supported entry point visible.
character result A function can return a fixed-length character value and callers can `trim` it.